ZGlmZiAtLWdpdCBhLy5jbGFuZy1mb3JtYXQgYi8uY2xhbmctZm9ybWF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NjE0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi8uY2xhbmctZm9ybWF0CkBAIC0wLDAgKzEsMTMgQEAKK0Jhc2VkT25TdHlsZTogR29vZ2xlCitTdGFuZGFyZDogQ3BwMTEKK0FjY2Vzc01vZGlmaWVyT2Zmc2V0OiAtMgorQWxsb3dTaG9ydEZ1bmN0aW9uc09uQVNpbmdsZUxpbmU6IElubGluZQorQ29sdW1uTGltaXQ6IDEwMAorQ29tbWVudFByYWdtYXM6IE5PTElOVDouKgorRGVyaXZlUG9pbnRlckFsaWdubWVudDogZmFsc2UKK0luY2x1ZGVCbG9ja3M6IFByZXNlcnZlCitJbmRlbnRXaWR0aDogNAorQ29udGludWF0aW9uSW5kZW50V2lkdGg6IDgKK1BvaW50ZXJBbGlnbm1lbnQ6IExlZnQKK1RhYldpZHRoOiA0CitVc2VUYWI6IE5ldmVyCmRpZmYgLS1naXQgYS9BbmRyb2lkLmJwIGIvQW5kcm9pZC5icAppbmRleCA2MGYwZmYxLi5lZTYwOWUxIDEwMDY0NAotLS0gYS9BbmRyb2lkLmJwCisrKyBiL0FuZHJvaWQuYnAKQEAgLTU3LDcgKzU3LDcgQEAKICAgICAgICAgICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKICAgICAgICAgICAgIGFwZXhfYXZhaWxhYmxlOiBbCiAgICAgICAgICAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgudXBkYXRhYmxlIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoIiwKICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAogICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKICAgICAgICAgICAgIF0sCkBAIC04Niw3ICs4Niw3IEBACiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAogICAgIGFwZXhfYXZhaWxhYmxlOiBbCiAgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKLSAgICAgICAgImNvbS5hbmRyb2lkLmJsdWV0b290aC51cGRhdGFibGUiLAorICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoIiwKICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAogICAgIF0sCmRpZmYgLS1naXQgYS9hcGV4L09XTkVSUyBiL2FwZXgvT1dORVJTCmluZGV4IDU1ODdmNWYuLjU0ODAyZDQgMTAwNjQ0Ci0tLSBhL2FwZXgvT1dORVJTCisrKyBiL2FwZXgvT1dORVJTCkBAIC0xLDYgKzEsNyBAQAotY2h6QGdvb2dsZS5jb20KLWR3a2FuZ0Bnb29nbGUuY29tCitlc3NpY2tAZ29vZ2xlLmNvbQogaml5b25nQGdvb2dsZS5jb20KIGxham9zQGdvb2dsZS5jb20KLW1hcmNvbmVAZ29vZ2xlLmNvbQotd2ppYUBnb29nbGUuY29tCituY2hhbGtvQGdvb2dsZS5jb20KKworaW5jbHVkZSBwbGF0Zm9ybS9wYWNrYWdlcy9tb2R1bGVzL2NvbW1vbjovTU9EVUxFU19PV05FUlMKKwpkaWZmIC0tZ2l0IGEvYXBleC9tZWRpYXN3Y29kZWMuMzJyYyBiL2FwZXgvbWVkaWFzd2NvZGVjLjMycmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlhZWYzNgotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvbWVkaWFzd2NvZGVjLjMycmMKQEAgLTAsMCArMSw2IEBACitzZXJ2aWNlIG1lZGlhLnN3Y29kZWMgL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy9iaW4vbWVkaWFzd2NvZGVjCisgICAgY2xhc3MgbWFpbgorICAgIHVzZXIgbWVkaWFjb2RlYworICAgIGdyb3VwIGNhbWVyYSBkcm1ycGMgbWVkaWFkcm0KKyAgICBpb3ByaW8gcnQgNAorICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaApkaWZmIC0tZ2l0IGEvYXBleC9tZWRpYXRyYW5zY29kaW5nLjMycmMgYi9hcGV4L21lZGlhdHJhbnNjb2RpbmcuMzJyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTY5NDYyCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9tZWRpYXRyYW5zY29kaW5nLjMycmMKQEAgLTAsMCArMSwxMiBAQAorIyBtZWRpYS50cmFuc2NvZGluZyBzZXJ2aWNlIGlzIGRlZmluZWQgb24gY29tLmFuZHJvaWQubWVkaWEgYXBleCB3aGljaCBnb2VzIGJhY2sKKyMgdG8gQVBJMjksIGJ1dCB3ZSBvbmx5IHdhbnQgaXQgc3RhcnRlZCBvbiBBUEkzMSsgZGV2aWNlcy4gU28gd2UgZGVjbGFyZSBpdCBhcworIyAiZGlzYWJsZWQiIGFuZCBzdGFydCBpdCBleHBsaWNpdGx5IG9uIGJvb3QuCitzZXJ2aWNlIG1lZGlhLnRyYW5zY29kaW5nIC9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhL2Jpbi9tZWRpYXRyYW5zY29kaW5nCisgICAgY2xhc3MgbWFpbgorICAgIHVzZXIgbWVkaWEKKyAgICBncm91cCBtZWRpYQorICAgIGlvcHJpbyBydCA0CisgICAgIyBSZXN0cmljdCB0byBsaXR0bGUgY29yZXMgb25seSB3aXRoIHN5c3RlbS1iYWNrZ3JvdW5kIGNwdXNldC4KKyAgICB0YXNrX3Byb2ZpbGVzIFNlcnZpY2VDYXBhY2l0eUxvdworICAgIGludGVyZmFjZSBhaWRsIG1lZGlhLnRyYW5zY29kaW5nCisgICAgZGlzYWJsZWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9BbmRyb2lkLmJwIGIvY2FtZXJhL0FuZHJvaWQuYnAKaW5kZXggNjg3OGMyMC4uNGVkMzI2OSAxMDA2NDQKLS0tIGEvY2FtZXJhL0FuZHJvaWQuYnAKKysrIGIvY2FtZXJhL0FuZHJvaWQuYnAKQEAgLTQzLDYgKzQzLDEwIEBACiAgICAgXSwKIH0KIAorY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAiY2FtZXJhX2hlYWRlcnMiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorfQogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJjYW1lcmFfY2xpZW50IiwKIApkaWZmIC0tZ2l0IGEvY2FtZXJhL09XTkVSUyBiL2NhbWVyYS9PV05FUlMKaW5kZXggZDZiOTVkYS4uMzg1YzE2MyAxMDA2NDQKLS0tIGEvY2FtZXJhL09XTkVSUworKysgYi9jYW1lcmEvT1dORVJTCkBAIC0xLDggKzEsNyBAQAotZXBlZXZAZ29vZ2xlLmNvbQorIyBCdWcgY29tcG9uZW50OiA0MTcyNwogZXRhbHZhbGFAZ29vZ2xlLmNvbQorYXJha2VzaEBnb29nbGUuY29tCitlcGVldkBnb29nbGUuY29tCiBqY2hvd2RoYXJ5QGdvb2dsZS5jb20KIHNodXpoZW53YW5nQGdvb2dsZS5jb20KLXlpbmNoaWF5ZWhAZ29vZ2xlLmNvbQotIyBiYWNrdXAgb3duZXIKLWN5Y2hlbkBnb29nbGUuY29tCi16aGlqdW5oZUBnb29nbGUuY29tCitydWNoYW1rQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKaW5kZXggY2NiZmFhOS4uZGE4ODdhMiAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKQEAgLTEzOSw2ICsxMzksOCBAQAogICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOwogICAgICAgICB9CiAgICAgICAgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdvcmRlcmVkLWNvbXBhcmUtZnVuY3Rpb24tcG9pbnRlcnMiCiAgICAgICAgICAgICBpZiAoKnRoaXMgPT0gb3RoZXIpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIGlmIChtQ29udGV4dCAhPSBvdGhlci5tQ29udGV4dCkgcmV0dXJuIG1Db250ZXh0IDwgb3RoZXIubUNvbnRleHQ7CiAgICAgICAgICAgICBpZiAobVBoeXNpY2FsQ2FtQXZhaWxhYmxlICE9IG90aGVyLm1QaHlzaWNhbENhbUF2YWlsYWJsZSkgewpAQCAtMTUyLDYgKzE1NCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobUF2YWlsYWJsZSAhPSBvdGhlci5tQXZhaWxhYmxlKSByZXR1cm4gbUF2YWlsYWJsZSA8IG90aGVyLm1BdmFpbGFibGU7CiAgICAgICAgICAgICByZXR1cm4gbVVuYXZhaWxhYmxlIDwgb3RoZXIubVVuYXZhaWxhYmxlOworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKICAgICAgICAgfQogICAgICAgICBib29sIG9wZXJhdG9yID4gKGNvbnN0IENhbGxiYWNrJiBvdGhlcikgY29uc3QgewogICAgICAgICAgICAgcmV0dXJuICgqdGhpcyAhPSBvdGhlciAmJiAhKCp0aGlzIDwgb3RoZXIpKTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAKaW5kZXggZGFiMmZlZi4uMDUxMjRjMCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAKQEAgLTE4Miw3ICsxODIsNyBAQAogICAgICAgICBpbnQ2NF90IGZvcm1hdCA9IGVudHJ5LmRhdGEuaTY0W2kgKyBTVFJFQU1fRk9STUFUX09GRlNFVF07CiAgICAgICAgIGludDY0X3Qgd2lkdGggPSBlbnRyeS5kYXRhLmk2NFtpICsgU1RSRUFNX1dJRFRIX09GRlNFVF07CiAgICAgICAgIGludDY0X3QgaGVpZ2h0ID0gZW50cnkuZGF0YS5pNjRbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKLSAgICAgICAgaW50NjRfdCBkdXJhdGlvbiA9IGVudHJ5LmRhdGEuaTMyW2kgKyBTVFJFQU1fRFVSQVRJT05fT0ZGU0VUXTsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvbiA9IGVudHJ5LmRhdGEuaTY0W2kgKyBTVFJFQU1fRFVSQVRJT05fT0ZGU0VUXTsKIAogICAgICAgICAvLyBMZWF2ZSB0aGUgdW5maWx0ZXJlZCBmb3JtYXQgaW4gc28gYXBwcyBkZXBlbmRpbmcgb24gcHJldmlvdXMgd3JvbmcKICAgICAgICAgLy8gZmlsdGVyIGJlaGF2aW9yIGNvbnRpbnVlIHRvIHdvcmsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmggYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCmluZGV4IDgzNTliYjEuLjQ2NjM1MjkgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaApAQCAtMTM2LDYgKzEzNiw4IEBACiAgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CiAgICAgICAgIH0KICAgICAgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBDYWxsYmFjayYgb3RoZXIpIGNvbnN0IHsKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV29yZGVyZWQtY29tcGFyZS1mdW5jdGlvbi1wb2ludGVycyIKICAgICAgICAgICAgIGlmICgqdGhpcyA9PSBvdGhlcikgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgaWYgKG1Db250ZXh0ICE9IG90aGVyLm1Db250ZXh0KSByZXR1cm4gbUNvbnRleHQgPCBvdGhlci5tQ29udGV4dDsKICAgICAgICAgICAgIGlmIChtQXZhaWxhYmxlICE9IG90aGVyLm1BdmFpbGFibGUpIHJldHVybiBtQXZhaWxhYmxlIDwgb3RoZXIubUF2YWlsYWJsZTsKQEAgLTE0Niw2ICsxNDgsNyBAQAogICAgICAgICAgICAgaWYgKG1QaHlzaWNhbENhbVVuYXZhaWxhYmxlICE9IG90aGVyLm1QaHlzaWNhbENhbVVuYXZhaWxhYmxlKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVBoeXNpY2FsQ2FtVW5hdmFpbGFibGUgPCBvdGhlci5tUGh5c2ljYWxDYW1VbmF2YWlsYWJsZTsKICAgICAgICAgICAgIHJldHVybiBtVW5hdmFpbGFibGUgPCBvdGhlci5tVW5hdmFpbGFibGU7CisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAogICAgICAgICB9CiAgICAgICAgIGJvb2wgb3BlcmF0b3IgPiAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CiAgICAgICAgICAgICByZXR1cm4gKCp0aGlzICE9IG90aGVyICYmICEoKnRoaXMgPCBvdGhlcikpOwpkaWZmIC0tZ2l0IGEvY21kcy9PV05FUlMgYi9jbWRzL09XTkVSUwppbmRleCAwZDMyYWFjLi5hNDhjMzdhIDEwMDY0NAotLS0gYS9jbWRzL09XTkVSUworKysgYi9jbWRzL09XTkVSUwpAQCAtMSwzICsxLDMgQEAKIGVsYXVyZW50QGdvb2dsZS5jb20KK2Vzc2lja0Bnb29nbGUuY29tCiBsYWpvc0Bnb29nbGUuY29tCi1tYXJjb25lQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5icCBiL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDc4M2QzCi0tLSAvZGV2L251bGwKKysrIGIvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjc4IEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9jbWRzX3N0YWdlZnJpZ2h0X2xpY2Vuc2UiXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfY21kc19zdGFnZWZyaWdodF9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJzdGFnZWZyaWdodCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJBdWRpb1BsYXllci5jcHAiLAorICAgICAgICAic3RhZ2VmcmlnaHQuY3BwIiwKKyAgICAgICAgImpwZWcuY3BwIiwKKyAgICAgICAgIlNpbmVTb3VyY2UuY3BwIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhbWV0cmljc19oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfY29kZWNsaXN0IiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmpwZWciLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliZGF0YXNvdXJjZSIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAorICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWyJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgXSwKKworICAgIHN5c3RlbV9leHRfc3BlY2lmaWM6IHRydWUsCit9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogInJlY29yZCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJBdWRpb1BsYXllci5jcHAiLAorICAgICAgICAiU2luZVNvdXJjZS5jcHAiLAorICAgICAgICAicmVjb3JkLmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgImNhbWVyYV9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJkYXRhc291cmNlIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKKyAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgXSwKK30KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAicmVjb3JkdmlkZW8iLAorCisgICAgc3JjczogWworICAgICAgICAiQXVkaW9QbGF5ZXIuY3BwIiwKKyAgICAgICAgInJlY29yZHZpZGVvLmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCisgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby1tdWx0aWNoYXIiLAorICAgIF0sCit9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImF1ZGlvbG9vcCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJBdWRpb1BsYXllci5jcHAiLAorICAgICAgICAiU2luZVNvdXJjZS5jcHAiLAorICAgICAgICAiYXVkaW9sb29wLmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCisgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby1tdWx0aWNoYXIiLAorICAgIF0sCit9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogInN0cmVhbSIsCisKKyAgICBzcmNzOiBbInN0cmVhbS5jcHAiXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmRhdGFzb3VyY2UiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1Xbm8tbXVsdGljaGFyIiwKKyAgICBdLAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJjb2RlYyIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJjb2RlYy5jcHAiLAorICAgICAgICAiU2ltcGxlUGxheWVyLmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYWRybV9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljc19oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgXSwKK30KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAibWVkaWFmaWx0ZXIiLAorCisgICAgc3JjczogWworICAgICAgICAiZmlsdGVycy9hcmdidG9yZ2JhLnJzY3JpcHQiLAorICAgICAgICAiZmlsdGVycy9uaWdodHZpc2lvbi5yc2NyaXB0IiwKKyAgICAgICAgImZpbHRlcnMvc2F0dXJhdGlvbi5yc2NyaXB0IiwKKyAgICAgICAgIm1lZGlhZmlsdGVyLmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYWRybV9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljc19oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAicnMtaGVhZGVycyIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0Il0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGliUlNjcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tZWRpYWZpbHRlciJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJtdXhlciIsCisKKyAgICBzcmNzOiBbIm11eGVyLmNwcCJdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhbWV0cmljc19oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJjIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tayBiL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAzYzRhNC4uMDAwMDAwMAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICBcCi0gICAgICAgIEF1ZGlvUGxheWVyLmNwcCBcCi0gICAgICAgIHN0YWdlZnJpZ2h0LmNwcCBcCi0gICAgICAgIGpwZWcuY3BwICAgICAgICBcCi0gICAgICAgIFNpbmVTb3VyY2UuY3BwCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyBcCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJtZWRpYV9jb2RlY2xpc3QgbGlidXRpbHMgbGliYmluZGVyIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJqcGVnIGxpYnVpIGxpYmd1aSBsaWJjdXRpbHMgbGlibG9nIFwKLSAgICAgICAgbGliaGlkbGJhc2UgbGliZGF0YXNvdXJjZSBsaWJhdWRpb2NsaWVudCBcCi0gICAgICAgIGFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCBcCi0gICAgICAgIGZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yIC1XYWxsCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NZU1RFTV9FWFRfTU9EVUxFOj0gdHJ1ZQotTE9DQUxfTU9EVUxFOj0gc3RhZ2VmcmlnaHQKLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgIFwKLSAgICAgICAgQXVkaW9QbGF5ZXIuY3BwIFwKLSAgICAgICAgU2luZVNvdXJjZS5jcHAgICAgXAotICAgICAgICByZWNvcmQuY3BwCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyBcCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJkYXRhc291cmNlIGxpYmF1ZGlvY2xpZW50IFwKLSAgICAgICAgZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9jYW1lcmEvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAotICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yIC1XYWxsCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX01PRFVMRTo9IHJlY29yZAotTE9DQUxfTElDRU5TRV9LSU5EUzo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUzo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEU6PSAkKExPQ0FMX1BBVEgpL05PVElDRQotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgXAotICAgICAgICBBdWRpb1BsYXllci5jcHAgXAotICAgICAgICByZWNvcmR2aWRlby5jcHAKLQotTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYm1lZGlhbWV0cmljc19oZWFkZXJzIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgXAotICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYmF1ZGlvY2xpZW50Ci0KLUxPQ0FMX0NfSU5DTFVERVM6PSBcCi0gICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAotICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlIFwKLSAgICAgICAgZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IgLVdhbGwKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfTU9EVUxFOj0gcmVjb3JkdmlkZW8KLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgXAotICAgICAgICBBdWRpb1BsYXllci5jcHAgXAotICAgICAgICBTaW5lU291cmNlLmNwcCAgICBcCi0gICAgICAgIGF1ZGlvbG9vcC5jcHAKLQotTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYm1lZGlhbWV0cmljc19oZWFkZXJzIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgXAotICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYmF1ZGlvY2xpZW50IFwKLSAgICAgICAgZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvciAtV2FsbAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9NT0RVTEU6PSBhdWRpb2xvb3AKLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgIFwKLSAgICAgICAgc3RyZWFtLmNwcCAgICBcCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyBcCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIGxpYnVpIGxpYmd1aSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlibWVkaWEgbGliY3V0aWxzIGxpYmRhdGFzb3VyY2UKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvciAtV2FsbAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9NT0RVTEU6PSBzdHJlYW0KLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKLSAgICAgICAgY29kZWMuY3BwICAgICAgICAgICAgICAgXAotICAgICAgICBTaW1wbGVQbGF5ZXIuY3BwICAgICAgICBcCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJtZWRpYWRybV9oZWFkZXJzIFwKLSAgICAgICAgbGlibWVkaWFtZXRyaWNzX2hlYWRlcnMgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICAgICAgbGlibWVkaWEgbGlibWVkaWFfb214IGxpYmF1ZGlvY2xpZW50IGxpYnVpIGxpYmd1aSBsaWJjdXRpbHMKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvciAtV2FsbAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9NT0RVTEU6PSBjb2RlYwotTE9DQUxfTElDRU5TRV9LSU5EUzo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUzo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEU6PSAkKExPQ0FMX1BBVEgpL05PVElDRQotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLSAgICAgICAgZmlsdGVycy9hcmdidG9yZ2JhLnJzY3JpcHQgXAotICAgICAgICBmaWx0ZXJzL25pZ2h0dmlzaW9uLnJzY3JpcHQgXAotICAgICAgICBmaWx0ZXJzL3NhdHVyYXRpb24ucnNjcmlwdCBcCi0gICAgICAgIG1lZGlhZmlsdGVyLmNwcCBcCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJtZWRpYWRybV9oZWFkZXJzIFwKLSAgICAgICAgbGlibWVkaWFtZXRyaWNzX2hlYWRlcnMgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHQgXAotICAgICAgICBsaWJsb2cgXAotICAgICAgICBsaWJ1dGlscyBcCi0gICAgICAgIGxpYmJpbmRlciBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAotICAgICAgICBsaWJtZWRpYV9vbXggXAotICAgICAgICBsaWJ1aSBcCi0gICAgICAgIGxpYmd1aSBcCi0gICAgICAgIGxpYlJTY3BwIFwKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCi0gICAgICAgIGZyYW1ld29ya3MvcnMvY3BwIFwKLSAgICAgICAgZnJhbWV3b3Jrcy9ycyBcCi0KLWludGVybWVkaWF0ZXMgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixTVEFUSUNfTElCUkFSSUVTLGxpYlJTLFRBUkdFVCwpCi1MT0NBTF9DX0lOQ0xVREVTICs9ICQoaW50ZXJtZWRpYXRlcykKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUzo9IFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfbWVkaWFmaWx0ZXIKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IgLVdhbGwKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfTU9EVUxFOj0gbWVkaWFmaWx0ZXIKLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLQotTE9DQUxfU0FOSVRJWkUgOj0gY2ZpCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICBcCi0gICAgICAgIG11eGVyLmNwcCAgICAgICAgICAgIFwKLQotTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYm1lZGlhbWV0cmljc19oZWFkZXJzIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCi0gICAgICAgIGxpYmN1dGlscyBsaWJjCi0KLUxPQ0FMX0NfSU5DTFVERVM6PSBcCi0gICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IgLVdhbGwKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfTU9EVUxFOj0gbXV4ZXIKLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL2RybXNlcnZlci5yYyBiL2RybS9kcm1zZXJ2ZXIvZHJtc2VydmVyLnJjCmluZGV4IGViMTc2YzEuLjAzMTlmZjkgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvZHJtc2VydmVyLnJjCisrKyBiL2RybS9kcm1zZXJ2ZXIvZHJtc2VydmVyLnJjCkBAIC0zLDcgKzMsNyBAQAogICAgIGNsYXNzIG1haW4KICAgICB1c2VyIGRybQogICAgIGdyb3VwIGRybSBzeXN0ZW0gaW5ldCBkcm1ycGMgcmVhZHByb2MKLSAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCisgICAgdGFza19wcm9maWxlcyBQcm9jZXNzQ2FwYWNpdHlIaWdoCiAKIG9uIHByb3BlcnR5OmRybS5zZXJ2aWNlLmVuYWJsZWQ9dHJ1ZQogICAgIHN0YXJ0IGRybQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAppbmRleCAwZmZlNjI2Li43MWRmNThjIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAorKysgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icApAQCAtNjYsNyArNjYsNyBAQAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAicmVzb3VyY2VtYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJyZXNvdXJjZW1hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrIiwKICAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL2Z1enplci9BbmRyb2lkLmJwIGIvZHJtL2xpYm1lZGlhZHJtL2Z1enplci9BbmRyb2lkLmJwCmluZGV4IDcyODEwNjYuLjQ5YmJhZDQgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9mdXp6ZXIvQW5kcm9pZC5icAorKysgYi9kcm0vbGlibWVkaWFkcm0vZnV6emVyL0FuZHJvaWQuYnAKQEAgLTM1LDcgKzM1LDcgQEAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlibWVkaWFkcm0iLAogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgInJlc291cmNlbWFuYWdlcl9haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAorICAgICAgICAicmVzb3VyY2VtYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLW5kayIsCiAgICAgXSwKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMKaW5kZXggOWFmZDNkNy4uZWM0NTE3ZCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS1sYXp5LmNsZWFya2V5LnJjCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYwpAQCAtMTEsNCArMTEsNCBAQAogICAgIHVzZXIgbWVkaWEKICAgICBncm91cCBtZWRpYSBtZWRpYWRybQogICAgIGlvcHJpbyBydCA0Ci0gICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcworICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleS5yYyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkucmMKaW5kZXggYzFhYmU3Zi4uM2I0OGNmMiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleS5yYworKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5LnJjCkBAIC0xMCw0ICsxMCw0IEBACiAgICAgdXNlciBtZWRpYQogICAgIGdyb3VwIG1lZGlhIG1lZGlhZHJtCiAgICAgaW9wcmlvIHJ0IDQKLSAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCisgICAgdGFza19wcm9maWxlcyBQcm9jZXNzQ2FwYWNpdHlIaWdoCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMy1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMy1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMKaW5kZXggMWUwZDQzMS4uNmU2NDk3OCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjMtc2VydmljZS1sYXp5LmNsZWFya2V5LnJjCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4zLXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYwpAQCAtMTMsNCArMTMsNCBAQAogICAgIHVzZXIgbWVkaWEKICAgICBncm91cCBtZWRpYSBtZWRpYWRybQogICAgIGlvcHJpbyBydCA0Ci0gICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcworICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjMtc2VydmljZS5jbGVhcmtleS5yYyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4zLXNlcnZpY2UuY2xlYXJrZXkucmMKaW5kZXggODEzMDUxMS4uZTMwMmUxYiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjMtc2VydmljZS5jbGVhcmtleS5yYworKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMy1zZXJ2aWNlLmNsZWFya2V5LnJjCkBAIC0xMSw0ICsxMSw0IEBACiAgICAgdXNlciBtZWRpYQogICAgIGdyb3VwIG1lZGlhIG1lZGlhZHJtCiAgICAgaW9wcmlvIHJ0IDQKLSAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCisgICAgdGFza19wcm9maWxlcyBQcm9jZXNzQ2FwYWNpdHlIaWdoCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNC1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNC1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMKaW5kZXggNDZhYmE4OC4uODRhNjNhMSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQtc2VydmljZS1sYXp5LmNsZWFya2V5LnJjCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40LXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYwpAQCAtMTUsNCArMTUsNCBAQAogICAgIHVzZXIgbWVkaWEKICAgICBncm91cCBtZWRpYSBtZWRpYWRybQogICAgIGlvcHJpbyBydCA0Ci0gICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcworICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQtc2VydmljZS5jbGVhcmtleS5yYyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40LXNlcnZpY2UuY2xlYXJrZXkucmMKaW5kZXggODE4NjkzMy4uNjQ5NTk5ZSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQtc2VydmljZS5jbGVhcmtleS5yYworKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNC1zZXJ2aWNlLmNsZWFya2V5LnJjCkBAIC0xMyw0ICsxMyw0IEBACiAgICAgdXNlciBtZWRpYQogICAgIGdyb3VwIG1lZGlhIG1lZGlhZHJtCiAgICAgaW9wcmlvIHJ0IDQKLSAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCisgICAgdGFza19wcm9maWxlcyBQcm9jZXNzQ2FwYWNpdHlIaWdoCmRpZmYgLS1naXQgYS9pbmNsdWRlL09XTkVSUyBiL2luY2x1ZGUvT1dORVJTCmluZGV4IGQ2YmQ5OTguLjg4ZGU1OTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvT1dORVJTCisrKyBiL2luY2x1ZGUvT1dORVJTCkBAIC0xLDYgKzEsNSBAQAogZWxhdXJlbnRAZ29vZ2xlLmNvbQotZ2thc3RlbkBnb29nbGUuY29tCiBodW5nYUBnb29nbGUuY29tCiBqdGlua2VyQGdvb2dsZS5jb20KIGxham9zQGdvb2dsZS5jb20KLW1hcmNvbmVAZ29vZ2xlLmNvbQorZXNzaWNrQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL09XTkVSUyBiL21lZGlhL09XTkVSUwppbmRleCA0Y2Y0ODcwLi4wOTk3MjlmIDEwMDY0NAotLS0gYS9tZWRpYS9PV05FUlMKKysrIGIvbWVkaWEvT1dORVJTCkBAIC0xNSw2ICsxNSw3IEBACiByb2JlcnRzaGloQGdvb2dsZS5jb20KIHRha2xlZUBnb29nbGUuY29tCiB3b25zaWtAZ29vZ2xlLmNvbQoreXRhaUBnb29nbGUuY29tCiAKICMgZ28vYW5kcm9pZC1md2stbWVkaWEtc29sdXRpb25zIGZvciBpbmZvIG9uIGFyZWFzIG9mIG93bmVyc2hpcC4KIGluY2x1ZGUgcGxhdGZvcm0vZnJhbWV3b3Jrcy9hdjovbWVkaWEvamFuaXRvcnMvbWVkaWFfc29sdXRpb25zX09XTkVSUwpkaWZmIC0tZ2l0IGEvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5icCBiL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQuYnAKaW5kZXggYmUyNWZmYi4uZTVmOTkwNyAxMDA2NDQKLS0tIGEvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLmJwCkBAIC0yNSw2ICsyNSw3IEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJwYWNrYWdlbWFuYWdlcl9haWRsLWNwcCIsCiAgICAgICAgICJsaWJhYXVkaW9zZXJ2aWNlIiwKICAgICAgICAgImxpYmF1ZGlvZmxpbmdlciIsCiAgICAgICAgICJsaWJhdWRpb3BvbGljeXNlcnZpY2UiLApAQCAtNDEsNyArNDIsNiBAQAogICAgICAgICAibGlicG93ZXJtYW5hZ2VyIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYnZpYnJhdG9yIiwKLQogICAgIF0sCiAKICAgICAvLyBUT0RPIGNoZWNrIGlmIHdlIHN0aWxsIG5lZWQgYWxsIG9mIHRoZXNlIGluY2x1ZGUgZGlyZWN0b3JpZXMKZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKaW5kZXggOGVlMWVmYi4uYzVhYzdmOSAxMDA2NDQKLS0tIGEvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKQEAgLTczLDEwICs3Myw4IEBACiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmpvaW5UaHJlYWRQb29sKCk7CiAgICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgIHNpZ2luZm9fdCBpbmZvOwotICAgICAgICAgICAgaW50IHJldCA9IHdhaXRpZChQX1BJRCwgY2hpbGRQaWQsICZpbmZvLCBXRVhJVEVEIHwgV1NUT1BQRUQgfCBXQ09OVElOVUVEKTsKLSAgICAgICAgICAgIGlmIChyZXQgPT0gRUlOVFIpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCByZXQgPSBURU1QX0ZBSUxVUkVfUkVUUlkod2FpdGlkKFBfUElELCBjaGlsZFBpZCwgJmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRVhJVEVEIHwgV1NUT1BQRUQgfCBXQ09OVElOVUVEKSk7CiAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL1RFU1RfTUFQUElORyBiL21lZGlhL2NvZGVjMi9URVNUX01BUFBJTkcKaW5kZXggNmFjNDIxMC4uYzY3MjhjOCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL1RFU1RfTUFQUElORworKysgYi9tZWRpYS9jb2RlYzIvVEVTVF9NQVBQSU5HCkBAIC0xNSwxMyArMTUsMzUgQEAKICAgICAgICAgfSwKICAgICAgICAgewogICAgICAgICAgICJleGNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlcXVpcmVzRGV2aWNlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJDdHNNZWRpYUF1ZGlvVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIjogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgImV4Y2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2UiCiAgICAgICAgIH0sCiAgICAgICAgIC8vIFRPRE86IGIvMTQ5MzE0NDE5CiAgICAgICAgIHsKLSAgICAgICAgICAiZXhjbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5tZWRpYS5jdHMuQXVkaW9QbGF5YmFja0NhcHR1cmVUZXN0IgorICAgICAgICAgICJleGNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmN0cy5BdWRpb1BsYXliYWNrQ2FwdHVyZVRlc3QiCiAgICAgICAgIH0sCiAgICAgICAgIHsKLSAgICAgICAgICAiZXhjbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5tZWRpYS5jdHMuQXVkaW9SZWNvcmRUZXN0IgorICAgICAgICAgICJleGNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmN0cy5BdWRpb1JlY29yZFRlc3QiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkN0c01lZGlhUGxheWVyVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIjogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgImV4Y2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2UiCiAgICAgICAgIH0KICAgICAgIF0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwCmluZGV4IGU4Mjg3ZjkuLmNjNDUxN2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwCkBAIC01MTEsNyArNTExLDcgQEAKIHN0YXR1c190IEMyU29mdEF2Y0RlYzo6aW5pdERlY29kZXIoKSB7CiAgICAgaWYgKE9LICE9IGNyZWF0ZURlY29kZXIoKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgbU51bUNvcmVzID0gTUlOKGdldENwdUNvcmVDb3VudCgpLCBNQVhfTlVNX0NPUkVTKTsKLSAgICBtU3RyaWRlID0gQUxJR04zMihtV2lkdGgpOworICAgIG1TdHJpZGUgPSBBTElHTjEyOChtV2lkdGgpOwogICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOwogICAgIHJlc2V0UGx1Z2luKCk7CiAgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CkBAIC03NzcsMjAgKzc3NywyMCBAQAogICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOwogICAgIH0KICAgICBpZiAobU91dEJsb2NrICYmCi0gICAgICAgICAgICAobU91dEJsb2NrLT53aWR0aCgpICE9IEFMSUdOMzIobVdpZHRoKSB8fCBtT3V0QmxvY2stPmhlaWdodCgpICE9IG1IZWlnaHQpKSB7CisgICAgICAgICAgICAobU91dEJsb2NrLT53aWR0aCgpICE9IEFMSUdOMTI4KG1XaWR0aCkgfHwgbU91dEJsb2NrLT5oZWlnaHQoKSAhPSBtSGVpZ2h0KSkgewogICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKICAgICB9CiAgICAgaWYgKCFtT3V0QmxvY2spIHsKICAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOwogICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CiAgICAgICAgIGMyX3N0YXR1c190IGVyciA9Ci0gICAgICAgICAgICBwb29sLT5mZXRjaEdyYXBoaWNCbG9jayhBTElHTjMyKG1XaWR0aCksIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZtT3V0QmxvY2spOworICAgICAgICAgICAgcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soQUxJR04xMjgobVdpZHRoKSwgbUhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJm1PdXRCbG9jayk7CiAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgICAgIEFMT0dWKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCkiLAotICAgICAgICAgICAgICBtT3V0QmxvY2stPndpZHRoKCksIG1PdXRCbG9jay0+aGVpZ2h0KCksIEFMSUdOMzIobVdpZHRoKSwgbUhlaWdodCk7CisgICAgICAgICAgICAgIG1PdXRCbG9jay0+d2lkdGgoKSwgbU91dEJsb2NrLT5oZWlnaHQoKSwgQUxJR04xMjgobVdpZHRoKSwgbUhlaWdodCk7CiAgICAgfQogCiAgICAgcmV0dXJuIEMyX09LOwpAQCAtOTI4LDcgKzkyOCw3IEBACiAgICAgICAgIGlmICgwIDwgcHNfZGVjb2RlX29wLT51NF9waWNfd2QgJiYgMCA8IHBzX2RlY29kZV9vcC0+dTRfcGljX2h0KSB7CiAgICAgICAgICAgICBpZiAobUhlYWRlckRlY29kZWQgPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICBtSGVhZGVyRGVjb2RlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVN0cmlkZSA9IEFMSUdOMzIocHNfZGVjb2RlX29wLT51NF9waWNfd2QpOworICAgICAgICAgICAgICAgIG1TdHJpZGUgPSBBTElHTjEyOChwc19kZWNvZGVfb3AtPnU0X3BpY193ZCk7CiAgICAgICAgICAgICAgICAgc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfRlJBTUUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHBzX2RlY29kZV9vcC0+dTRfcGljX3dkICE9IG1XaWR0aCB8fCBwc19kZWNvZGVfb3AtPnU0X3BpY19odCAhPSBtSGVpZ2h0KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmgKaW5kZXggNWMwN2QyOS4uNTlkNTE4NCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5oCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuaApAQCAtMzgsNyArMzgsNyBAQAogI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCAgIGloMjY0ZF9jdGxfc2V0X251bV9jb3Jlc19vcF90CiAjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdCAgaWgyNjRkX2N0bF9nZXRfdnVpX3BhcmFtc19pcF90CiAjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCAgaWgyNjRkX2N0bF9nZXRfdnVpX3BhcmFtc19vcF90Ci0jZGVmaW5lIEFMSUdOMzIoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoKHgpICsgMzEpID4+IDUpIDw8IDUpCisjZGVmaW5lIEFMSUdOMTI4KHgpICAgICAgICAgICAgICAgICAgICAgKCgoKHgpICsgMTI3KSA+PiA3KSA8PCA3KQogI2RlZmluZSBNQVhfTlVNX0NPUkVTICAgICAgICAgICAgICAgICAgIDQKICNkZWZpbmUgSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUyAgICBcCiAgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpSUgyNjREX0NNRF9DVExfU0VUX05VTV9DT1JFUwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0VuYy5jcHAKaW5kZXggNmZlYWQzYS4uMTgyZWRmYiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuY3BwCkBAIC00MzksOSArNDM5LDYgQEAKICAgICB9CiAgICAgRkxBQ19fYm9vbCBvayA9IEZMQUNfX3N0cmVhbV9lbmNvZGVyX2ZpbmlzaChtRmxhY1N0cmVhbUVuY29kZXIpOwogICAgIGlmICghb2spIHJldHVybiBDMl9DT1JSVVBURUQ7Ci0gICAgbUlzRmlyc3RGcmFtZSA9IHRydWU7Ci0gICAgbUFuY2hvclRpbWVTdGFtcCA9IDB1bGw7Ci0gICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwdTsKIAogICAgIHJldHVybiBDMl9PSzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0MyU29mdEdhdjFEZWMuY3BwCmluZGV4IGY4NTdlODcuLjQ3NWQ4NjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9DMlNvZnRHYXYxRGVjLmNwcApAQCAtMjAsNiArMjAsOCBAQAogCiAjaW5jbHVkZSA8QzJEZWJ1Zy5oPgogI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KKyNpbmNsdWRlIDxDb2RlYzJNYXBwZXIuaD4KICNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgogI2luY2x1ZGUgPGxvZy9sb2cuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgpAQCAtMTU2LDYgKzE1OCw0MiBAQAogICAgICAgICAgICAgLndpdGhTZXR0ZXIoRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcikKICAgICAgICAgICAgIC5idWlsZCgpKTsKIAorICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29kZWRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX0xJTUlURUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29sb3JBc3BlY3RzU2V0dGVyLCBtRGVmYXVsdENvbG9yQXNwZWN0cywgbUNvZGVkQ29sb3JBc3BlY3RzKQorICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKICAgICAvLyBUT0RPOiBzdXBwb3J0IG1vcmUgZm9ybWF0cz8KICAgICBhZGRQYXJhbWV0ZXIoRGVmaW5lUGFyYW0obVBpeGVsRm9ybWF0LCBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQpCiAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCkBAIC0yMTgsNiArMjU2LDM3IEBACiAgICAgcmV0dXJuIEMyUjo6T2soKTsKICAgfQogCisgIHN0YXRpYyBDMlIgQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICh2b2lkKW1heUJsb2NrOworICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgfQorICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgIH0KKyAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgIH0KKyAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICB9CisgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgfQorCisgIHN0YXRpYyBDMlIgQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gJmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZjb2RlZCkgeworICAgICh2b2lkKW1heUJsb2NrOworICAgIC8vIHRha2UgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCB1bnNwZWNpZmllZCBmaWVsZHMsIGFuZCBjb2RlZCB2YWx1ZXMgZm9yIHNwZWNpZmllZCBvbmVzCisgICAgbWUuc2V0KCkucmFuZ2UgPSBjb2RlZC52LnJhbmdlID09IFJBTkdFX1VOU1BFQ0lGSUVEID8gZGVmLnYucmFuZ2UgOiBjb2RlZC52LnJhbmdlOworICAgIG1lLnNldCgpLnByaW1hcmllcyA9IGNvZGVkLnYucHJpbWFyaWVzID09IFBSSU1BUklFU19VTlNQRUNJRklFRAorICAgICAgICA/IGRlZi52LnByaW1hcmllcyA6IGNvZGVkLnYucHJpbWFyaWVzOworICAgIG1lLnNldCgpLnRyYW5zZmVyID0gY29kZWQudi50cmFuc2ZlciA9PSBUUkFOU0ZFUl9VTlNQRUNJRklFRAorICAgICAgICA/IGRlZi52LnRyYW5zZmVyIDogY29kZWQudi50cmFuc2ZlcjsKKyAgICBtZS5zZXQoKS5tYXRyaXggPSBjb2RlZC52Lm1hdHJpeCA9PSBNQVRSSVhfVU5TUEVDSUZJRUQgPyBkZWYudi5tYXRyaXggOiBjb2RlZC52Lm1hdHJpeDsKKyAgICByZXR1cm4gQzJSOjpPaygpOworICB9CisKICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoCiAgICAgICBib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gJm1lLAogICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CkBAIC0yMzIsNiArMzAxLDEwIEBACiAgICAgcmV0dXJuIG1EZWZhdWx0Q29sb3JBc3BlY3RzOwogICB9CiAKKyAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBnZXRDb2xvckFzcGVjdHNfbCgpIHsKKyAgICAgIHJldHVybiBtQ29sb3JBc3BlY3RzOworICB9CisKICAgc3RhdGljIEMyUiBIZHIxMFBsdXNJbmZvSW5wdXRTZXR0ZXIoYm9vbCBtYXlCbG9jaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQ+ICZtZSkgewogICAgICh2b2lkKW1heUJsb2NrOwpAQCAtMjU0LDYgKzMyNyw4IEBACiAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBtQ29sb3JJbmZvOwogICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dD4gbVBpeGVsRm9ybWF0OwogICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gbURlZmF1bHRDb2xvckFzcGVjdHM7CisgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiBtQ29kZWRDb2xvckFzcGVjdHM7CisgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gbUNvbG9yQXNwZWN0czsKICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQ+IG1IZHIxMFBsdXNJbmZvSW5wdXQ7CiAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dD4gbUhkcjEwUGx1c0luZm9PdXRwdXQ7CiB9OwpAQCAtMjY0LDYgKzMzOSw3IEBACiAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKICAgICAgIG1JbnRmKGludGZJbXBsKSwKICAgICAgIG1Db2RlY0N0eChudWxscHRyKSB7CisgIG1Jc0Zvcm1hdFIxMEcxMEIxMEEyU3VwcG9ydGVkID0gSXNGb3JtYXRSMTBHMTBCMTBBMlN1cHBvcnRlZEZvckxlZ2FjeVJlbmRlcmluZygpOwogICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOwogICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKIH0KQEAgLTM3MSw2ICs0NDcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaykgewogICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9CiAgICAgICBjcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLCBDMlJlY3QobVdpZHRoLCBtSGVpZ2h0KSk7CisgIHsKKyAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgYnVmZmVyLT5zZXRJbmZvKG1JbnRmLT5nZXRDb2xvckFzcGVjdHNfbCgpKTsKKyAgfQogICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlciwgaW5kZXhdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CiAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwogICAgIGlmICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAmJgpAQCAtNjA5LDYgKzY4OSwzOCBAQAogICB9CiB9CiAKK3ZvaWQgQzJTb2Z0R2F2MURlYzo6Z2V0VnVpUGFyYW1zKGNvbnN0IGxpYmdhdjE6OkRlY29kZXJCdWZmZXIgKmJ1ZmZlcikgeworICAgIFZ1aUNvbG9yQXNwZWN0cyB2dWlDb2xvckFzcGVjdHM7CisgICAgdnVpQ29sb3JBc3BlY3RzLnByaW1hcmllcyA9IGJ1ZmZlci0+Y29sb3JfcHJpbWFyeTsKKyAgICB2dWlDb2xvckFzcGVjdHMudHJhbnNmZXIgPSBidWZmZXItPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKKyAgICB2dWlDb2xvckFzcGVjdHMuY29lZmZzID0gYnVmZmVyLT5tYXRyaXhfY29lZmZpY2llbnRzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5mdWxsUmFuZ2UgPSBidWZmZXItPmNvbG9yX3JhbmdlOworCisgICAgLy8gY29udmVydCB2dWkgYXNwZWN0cyB0byBDMiB2YWx1ZXMgaWYgY2hhbmdlZAorICAgIGlmICghKHZ1aUNvbG9yQXNwZWN0cyA9PSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzKSkgeworICAgICAgICBtQml0c3RyZWFtQ29sb3JBc3BlY3RzID0gdnVpQ29sb3JBc3BlY3RzOworICAgICAgICBDb2xvckFzcGVjdHMgc2ZBc3BlY3RzOworICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0IGNvZGVkQXNwZWN0cyA9IHsgMHUgfTsKKyAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKAorICAgICAgICAgICAgICAgIHZ1aUNvbG9yQXNwZWN0cy5wcmltYXJpZXMsIHZ1aUNvbG9yQXNwZWN0cy50cmFuc2ZlciwgdnVpQ29sb3JBc3BlY3RzLmNvZWZmcywKKyAgICAgICAgICAgICAgICB2dWlDb2xvckFzcGVjdHMuZnVsbFJhbmdlLCBzZkFzcGVjdHMpOworICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1QcmltYXJpZXMsICZjb2RlZEFzcGVjdHMucHJpbWFyaWVzKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1SYW5nZSwgJmNvZGVkQXNwZWN0cy5yYW5nZSkpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubU1hdHJpeENvZWZmcywgJmNvZGVkQXNwZWN0cy5tYXRyaXgpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVRyYW5zZmVyLCAmY29kZWRBc3BlY3RzLnRyYW5zZmVyKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICBtSW50Zi0+Y29uZmlnKHsmY29kZWRBc3BlY3RzfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIH0KK30KKwogYm9vbCBDMlNvZnRHYXYxRGVjOjpvdXRwdXRCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CiAgIGlmICghKHdvcmsgJiYgcG9vbCkpIHJldHVybiBmYWxzZTsKQEAgLTY1MSw2ICs3NjMsNyBAQAogICAgIH0KICAgfQogCisgIGdldFZ1aVBhcmFtcyhidWZmZXIpOwogICBpZiAoIShidWZmZXItPmltYWdlX2Zvcm1hdCA9PSBsaWJnYXYxOjprSW1hZ2VGb3JtYXRZdXY0MjAgfHwKICAgICAgICAgYnVmZmVyLT5pbWFnZV9mb3JtYXQgPT0gbGliZ2F2MTo6a0ltYWdlRm9ybWF0TW9ub2Nocm9tZTQwMCkpIHsKICAgICBBTE9HRSgiaW1hZ2VfZm9ybWF0ICVkIG5vdCBzdXBwb3J0ZWQiLCBidWZmZXItPmltYWdlX2Zvcm1hdCk7CkBAIC02NjYsMTIgKzc3OSwxMiBAQAogICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CiAgIGlmIChidWZmZXItPmJpdGRlcHRoID09IDEwKSB7CiAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckFzcGVjdHMgPQotICAgICAgICBtSW50Zi0+Z2V0RGVmYXVsdENvbG9yQXNwZWN0c19sKCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBjb2RlZENvbG9yQXNwZWN0cyA9CisgICAgICAgIG1JbnRmLT5nZXRDb2xvckFzcGVjdHNfbCgpOwogCi0gICAgaWYgKGRlZmF1bHRDb2xvckFzcGVjdHMtPnByaW1hcmllcyA9PSBDMkNvbG9yOjpQUklNQVJJRVNfQlQyMDIwICYmCi0gICAgICAgIGRlZmF1bHRDb2xvckFzcGVjdHMtPm1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQyMDIwICYmCi0gICAgICAgIGRlZmF1bHRDb2xvckFzcGVjdHMtPnRyYW5zZmVyID09IEMyQ29sb3I6OlRSQU5TRkVSX1NUMjA4NCkgeworICAgIGlmIChjb2RlZENvbG9yQXNwZWN0cy0+cHJpbWFyaWVzID09IEMyQ29sb3I6OlBSSU1BUklFU19CVDIwMjAgJiYKKyAgICAgICAgY29kZWRDb2xvckFzcGVjdHMtPm1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQyMDIwICYmCisgICAgICAgIGNvZGVkQ29sb3JBc3BlY3RzLT50cmFuc2ZlciA9PSBDMkNvbG9yOjpUUkFOU0ZFUl9TVDIwODQpIHsKICAgICAgIGlmIChidWZmZXItPmltYWdlX2Zvcm1hdCAhPSBsaWJnYXYxOjprSW1hZ2VGb3JtYXRZdXY0MjApIHsKICAgICAgICAgQUxPR0UoIk9ubHkgWVVWNDIwIG91dHB1dCBpcyBzdXBwb3J0ZWQgd2hlbiB0YXJnZXRpbmcgUkdCQV8xMDEwMTAyIik7CiAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CkBAIC02NzksNyArNzkyLDE0IEBACiAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgIH0KLSAgICAgIGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyOworICAgICAgLy8gVE9ETyAoYi8yMDE3ODc5NTYpIEZvciBkZXZpY2VzIHRoYXQgZG8gbm90IHN1cHBvcnQgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDIsCisgICAgICAvLyBIQUxfUElYRUxfRk9STUFUX1lWMTIgaXMgdXNlZCBhcyBhIHRlbXBvcmFyeSB3b3JrIGFyb3VuZC4KKyAgICAgIGlmICghbUlzRm9ybWF0UjEwRzEwQjEwQTJTdXBwb3J0ZWQpICB7CisgICAgICAgIEFMT0dFKCJIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMiBpc24ndCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDI7CisgICAgICB9CiAgICAgfQogICB9CiAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX07CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0MyU29mdEdhdjFEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5oCmluZGV4IDU1NWFkYzkuLmY4Mjk5MmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5oCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5oCkBAIC0xNyw3ICsxNywxMCBAQAogI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfR0FWMV9ERUNfSF8KICNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0dBVjFfREVDX0hfCiAKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKwogI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KICNpbmNsdWRlICJsaWJnYXYxL3NyYy9nYXYxL2RlY29kZXIuaCIKICNpbmNsdWRlICJsaWJnYXYxL3NyYy9nYXYxL2RlY29kZXJfc2V0dGluZ3MuaCIKIApAQCAtNTYsMTAgKzU5LDMzIEBACiAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CiAKKyAgLy8gQ29sb3IgYXNwZWN0cy4gVGhlc2UgYXJlIElTTyB2YWx1ZXMgYW5kIGFyZSBtZWFudCB0byBkZXRlY3QgY2hhbmdlcyBpbiBhc3BlY3RzIHRvIGF2b2lkCisgIC8vIGNvbnZlcnRpbmcgdGhlbSB0byBDMiB2YWx1ZXMgZm9yIGVhY2ggZnJhbWUKKyAgc3RydWN0IFZ1aUNvbG9yQXNwZWN0cyB7CisgICAgICB1aW50OF90IHByaW1hcmllczsKKyAgICAgIHVpbnQ4X3QgdHJhbnNmZXI7CisgICAgICB1aW50OF90IGNvZWZmczsKKyAgICAgIHVpbnQ4X3QgZnVsbFJhbmdlOworCisgICAgICAvLyBkZWZhdWx0IGNvbG9yIGFzcGVjdHMKKyAgICAgIFZ1aUNvbG9yQXNwZWN0cygpCisgICAgICAgICAgOiBwcmltYXJpZXMoQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVEKSwKKyAgICAgICAgICAgIHRyYW5zZmVyKEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVEKSwKKyAgICAgICAgICAgIGNvZWZmcyhDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpLAorICAgICAgICAgICAgZnVsbFJhbmdlKEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVEKSB7IH0KKworICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZ1aUNvbG9yQXNwZWN0cyAmbykgeworICAgICAgICAgIHJldHVybiBwcmltYXJpZXMgPT0gby5wcmltYXJpZXMgJiYgdHJhbnNmZXIgPT0gby50cmFuc2ZlciAmJiBjb2VmZnMgPT0gby5jb2VmZnMKKyAgICAgICAgICAgICAgICAgICYmIGZ1bGxSYW5nZSA9PSBvLmZ1bGxSYW5nZTsKKyAgICAgIH0KKyAgfSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzOworCiAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7ICAvLyBUaW1lIGF0IHRoZSBzdGFydCBvZiBkZWNvZGUoKQogICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsgICAgLy8gVGltZSBhdCB0aGUgZW5kIG9mIGRlY29kZSgpCisgIGJvb2wgbUlzRm9ybWF0UjEwRzEwQjEwQTJTdXBwb3J0ZWQ7CiAKICAgYm9vbCBpbml0RGVjb2RlcigpOworICB2b2lkIGdldFZ1aVBhcmFtcyhjb25zdCBsaWJnYXYxOjpEZWNvZGVyQnVmZmVyICpidWZmZXIpOwogICB2b2lkIGRlc3Ryb3lEZWNvZGVyKCk7CiAgIHZvaWQgZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCiAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+JiBibG9jayk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmNwcAppbmRleCA2YmNmM2EyLi41ZjViMmVmIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5jcHAKQEAgLTUwMiw3ICs1MDIsNyBAQAogc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6aW5pdERlY29kZXIoKSB7CiAgICAgaWYgKE9LICE9IGNyZWF0ZURlY29kZXIoKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgbU51bUNvcmVzID0gTUlOKGdldENwdUNvcmVDb3VudCgpLCBNQVhfTlVNX0NPUkVTKTsKLSAgICBtU3RyaWRlID0gQUxJR04zMihtV2lkdGgpOworICAgIG1TdHJpZGUgPSBBTElHTjEyOChtV2lkdGgpOwogICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOwogICAgIHJlc2V0UGx1Z2luKCk7CiAgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CkBAIC03NjgsMjAgKzc2OCwyMCBAQAogICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOwogICAgIH0KICAgICBpZiAobU91dEJsb2NrICYmCi0gICAgICAgICAgICAobU91dEJsb2NrLT53aWR0aCgpICE9IEFMSUdOMzIobVdpZHRoKSB8fCBtT3V0QmxvY2stPmhlaWdodCgpICE9IG1IZWlnaHQpKSB7CisgICAgICAgICAgICAobU91dEJsb2NrLT53aWR0aCgpICE9IEFMSUdOMTI4KG1XaWR0aCkgfHwgbU91dEJsb2NrLT5oZWlnaHQoKSAhPSBtSGVpZ2h0KSkgewogICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKICAgICB9CiAgICAgaWYgKCFtT3V0QmxvY2spIHsKICAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOwogICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CiAgICAgICAgIGMyX3N0YXR1c190IGVyciA9Ci0gICAgICAgICAgICBwb29sLT5mZXRjaEdyYXBoaWNCbG9jayhBTElHTjMyKG1XaWR0aCksIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZtT3V0QmxvY2spOworICAgICAgICAgICAgcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soQUxJR04xMjgobVdpZHRoKSwgbUhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJm1PdXRCbG9jayk7CiAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgICAgIEFMT0dWKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCkiLAotICAgICAgICAgICAgICBtT3V0QmxvY2stPndpZHRoKCksIG1PdXRCbG9jay0+aGVpZ2h0KCksIEFMSUdOMzIobVdpZHRoKSwgbUhlaWdodCk7CisgICAgICAgICAgICAgIG1PdXRCbG9jay0+d2lkdGgoKSwgbU91dEJsb2NrLT5oZWlnaHQoKSwgQUxJR04xMjgobVdpZHRoKSwgbUhlaWdodCk7CiAgICAgfQogCiAgICAgcmV0dXJuIEMyX09LOwpAQCAtOTE3LDcgKzkxNyw3IEBACiAgICAgICAgIGlmICgwIDwgcHNfZGVjb2RlX29wLT51NF9waWNfd2QgJiYgMCA8IHBzX2RlY29kZV9vcC0+dTRfcGljX2h0KSB7CiAgICAgICAgICAgICBpZiAobUhlYWRlckRlY29kZWQgPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICBtSGVhZGVyRGVjb2RlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc2V0UGFyYW1zKEFMSUdOMzIocHNfZGVjb2RlX29wLT51NF9waWNfd2QpLCBJVkRfREVDT0RFX0ZSQU1FKTsKKyAgICAgICAgICAgICAgICBzZXRQYXJhbXMoQUxJR04xMjgocHNfZGVjb2RlX29wLT51NF9waWNfd2QpLCBJVkRfREVDT0RFX0ZSQU1FKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChwc19kZWNvZGVfb3AtPnU0X3BpY193ZCAhPSBtV2lkdGggfHwgIHBzX2RlY29kZV9vcC0+dTRfcGljX2h0ICE9IG1IZWlnaHQpIHsKICAgICAgICAgICAgICAgICBtV2lkdGggPSBwc19kZWNvZGVfb3AtPnU0X3BpY193ZDsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmgKaW5kZXggYjliMGE0OC4uYjkyOTZlOSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmgKQEAgLTM2LDcgKzM2LDcgQEAKICNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QgICBpaGV2Y2RfY3hhX2N0bF9zZXRfbnVtX2NvcmVzX29wX3QKICNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90ICBpaGV2Y2RfY3hhX2N0bF9nZXRfdnVpX3BhcmFtc19pcF90CiAjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCAgaWhldmNkX2N4YV9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdAotI2RlZmluZSBBTElHTjMyKHgpICAgICAgICAgICAgICAgICAgICAgICgoKCh4KSArIDMxKSA+PiA1KSA8PCA1KQorI2RlZmluZSBBTElHTjEyOCh4KSAgICAgICAgICAgICAgICAgICAgICgoKCh4KSArIDEyNykgPj4gNykgPDwgNykKICNkZWZpbmUgTUFYX05VTV9DT1JFUyAgICAgICAgICAgICAgICAgICA0CiAjZGVmaW5lIElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMgICAgXAogICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlIRVZDRF9DWEFfQ01EX0NUTF9TRVRfTlVNX0NPUkVTCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmNwcAppbmRleCA0YmMxNzc3Li5iN2E1Njg2IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0VuYy5jcHAKQEAgLTI0NSw2ICsyNDUsMTkgQEAKICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyLCBtQ29sb3JBc3BlY3RzKQogICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBpY3R1cmVRdWFudGl6YXRpb24sIEMyX1BBUkFNS0VZX1BJQ1RVUkVfUVVBTlRJWkFUSU9OKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlN0cmVhbVBpY3R1cmVRdWFudGl6YXRpb25UdW5pbmc6Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIGZsZXhDb3VudCAqLywgMHUgLyogc3RyZWFtICovKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1QaWN0dXJlUXVhbnRpemF0aW9uLCBtLnZhbHVlc1swXS50eXBlXykub25lT2YoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoSV9GUkFNRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OnBpY3R1cmVfdHlwZV90KFBfRlJBTUUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChCX0ZSQU1FKX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobVBpY3R1cmVRdWFudGl6YXRpb24sIG0udmFsdWVzWzBdLm1pbikuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtUGljdHVyZVF1YW50aXphdGlvbiwgbS52YWx1ZXNbMF0ubWF4KS5hbnkoKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUGljdHVyZVF1YW50aXphdGlvblNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CiAgICAgfQogCiAgICAgc3RhdGljIEMyUiBJbnB1dERlbGF5U2V0dGVyKApAQCAtNDY0LDkgKzQ3Nyw2OSBAQAogICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBjb2RlZC52Lm1hdHJpeDsKICAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKICAgICB9CisgICAgc3RhdGljIEMyUiBQaWN0dXJlUXVhbnRpemF0aW9uU2V0dGVyKGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVRdWFudGl6YXRpb25UdW5pbmc6Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworCisgICAgICAgIC8vIHRoZXNlIGFyZSB0aGUgb25lcyB3ZSdyZSBnb2luZyB0byBzZXQsIHNvIHdhbnQgdGhlbSB0byBkZWZhdWx0CisgICAgICAgIC8vIHRvIHRoZSBERUZBVUxUIHZhbHVlcyBmb3IgdGhlIGNvZGVjCisgICAgICAgIGludDMyX3QgaU1pbiA9IEhFVkNfUVBfTUlOLCBwTWluID0gSEVWQ19RUF9NSU4sIGJNaW4gPSBIRVZDX1FQX01JTjsKKyAgICAgICAgaW50MzJfdCBpTWF4ID0gSEVWQ19RUF9NQVgsIHBNYXggPSBIRVZDX1FQX01BWCwgYk1heCA9IEhFVkNfUVBfTUFYOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWUudi5mbGV4Q291bnQoKTsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBDMlBpY3R1cmVRdWFudGl6YXRpb25TdHJ1Y3QgJmxheWVyID0gbWUudi5tLnZhbHVlc1tpXTsKKworICAgICAgICAgICAgLy8gbGF5ZXJNaW4gaXMgY2xhbXBlZCB0byBbSEVWQ19RUF9NSU4sIGxheWVyTWF4XSB0byBhdm9pZCBlcnJvcgorICAgICAgICAgICAgLy8gY2FzZXMgd2hlcmUgbGF5ZXIubWluID4gbGF5ZXIubWF4CisgICAgICAgICAgICBpbnQzMl90IGxheWVyTWF4ID0gc3RkOjpjbGFtcChsYXllci5tYXgsIEhFVkNfUVBfTUlOLCBIRVZDX1FQX01BWCk7CisgICAgICAgICAgICBpbnQzMl90IGxheWVyTWluID0gc3RkOjpjbGFtcChsYXllci5taW4sIEhFVkNfUVBfTUlOLCBsYXllck1heCk7CisgICAgICAgICAgICBpZiAobGF5ZXIudHlwZV8gPT0gQzJDb25maWc6OnBpY3R1cmVfdHlwZV90KElfRlJBTUUpKSB7CisgICAgICAgICAgICAgICAgaU1heCA9IGxheWVyTWF4OworICAgICAgICAgICAgICAgIGlNaW4gPSBsYXllck1pbjsKKyAgICAgICAgICAgICAgICBBTE9HVigiaU1pbiAlZCBpTWF4ICVkIiwgaU1pbiwgaU1heCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxheWVyLnR5cGVfID09IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChQX0ZSQU1FKSkgeworICAgICAgICAgICAgICAgIHBNYXggPSBsYXllck1heDsKKyAgICAgICAgICAgICAgICBwTWluID0gbGF5ZXJNaW47CisgICAgICAgICAgICAgICAgQUxPR1YoInBNaW4gJWQgcE1heCAlZCIsIHBNaW4sIHBNYXgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChsYXllci50eXBlXyA9PSBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoQl9GUkFNRSkpIHsKKyAgICAgICAgICAgICAgICBiTWF4ID0gbGF5ZXJNYXg7CisgICAgICAgICAgICAgICAgYk1pbiA9IGxheWVyTWluOworICAgICAgICAgICAgICAgIEFMT0dWKCJiTWluICVkIGJNYXggJWQiLCBiTWluLCBiTWF4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJQaWN0dXJlUXVhbnRpemF0aW9uU2V0dGVyKGVudHJ5KTogaSAlZC0lZCBwICVkLSVkIGIgJWQtJWQiLAorICAgICAgICAgICAgICBpTWluLCBpTWF4LCBwTWluLCBwTWF4LCBiTWluLCBiTWF4KTsKKworICAgICAgICBpbnQzMl90IG1heEZyYW1lUVAgPSBzdGQ6Om1pbihzdGQ6Om1pbihpTWF4LCBwTWF4KSwgYk1heCk7CisgICAgICAgIGludDMyX3QgbWluRnJhbWVRUCA9IHN0ZDo6bWF4KHN0ZDo6bWF4KGlNaW4sIHBNaW4pLCBiTWluKTsKKyAgICAgICAgaWYgKG1pbkZyYW1lUVAgPiBtYXhGcmFtZVFQKSB7CisgICAgICAgICAgICBtaW5GcmFtZVFQID0gbWF4RnJhbWVRUDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHB1dCB0aGVtIGJhY2sgaW50byB0aGUgc3RydWN0dXJlCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWUudi5mbGV4Q291bnQoKTsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBDMlBpY3R1cmVRdWFudGl6YXRpb25TdHJ1Y3QgJmxheWVyID0gbWUudi5tLnZhbHVlc1tpXTsKKworICAgICAgICAgICAgaWYgKGxheWVyLnR5cGVfID09IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChJX0ZSQU1FKSB8fAorICAgICAgICAgICAgICAgIGxheWVyLnR5cGVfID09IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChQX0ZSQU1FKSB8fAorICAgICAgICAgICAgICAgIGxheWVyLnR5cGVfID09IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChCX0ZSQU1FKSkgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm0udmFsdWVzW2ldLm1heCA9IG1heEZyYW1lUVA7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkubS52YWx1ZXNbaV0ubWluID0gbWluRnJhbWVRUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJQaWN0dXJlUXVhbnRpemF0aW9uU2V0dGVyKGV4aXQpOiBpID0gcCA9IGIgPSAlZC0lZCIsCisgICAgICAgICAgICAgIG1pbkZyYW1lUVAsIG1heEZyYW1lUVApOworCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gZ2V0Q29kZWRDb2xvckFzcGVjdHNfbCgpIHsKICAgICAgICAgcmV0dXJuIG1Db2RlZENvbG9yQXNwZWN0czsKICAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVF1YW50aXphdGlvblR1bmluZzo6b3V0cHV0PiBnZXRQaWN0dXJlUXVhbnRpemF0aW9uX2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUGljdHVyZVF1YW50aXphdGlvbjsKKyAgICB9CiAKICAgIHByaXZhdGU6CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0PiBtVXNhZ2U7CkBAIC00ODIsNiArNTU1LDcgQEAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Hb3BUdW5pbmc6Om91dHB1dD4gbUdvcDsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gbUNvbG9yQXNwZWN0czsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IG1Db2RlZENvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlUXVhbnRpemF0aW9uVHVuaW5nOjpvdXRwdXQ+IG1QaWN0dXJlUXVhbnRpemF0aW9uOwogfTsKIAogc3RhdGljIHNpemVfdCBHZXRDUFVDb3JlQ291bnQoKSB7CkBAIC02NTQsMTIgKzcyOCw0MSBAQAogICAgICAgICBtRW5jUGFyYW1zLnNfY29kaW5nX3Rvb2xzX3BybXMuaTRfbWF4X3RlbXBvcmFsX2xheWVycyA9IDM7CiAgICAgfQogCi0gICAgc3dpdGNoIChtQml0cmF0ZU1vZGUtPnZhbHVlKSB7Ci0gICAgICAgIGNhc2UgQzJDb25maWc6OkJJVFJBVEVfSUdOT1JFOgotICAgICAgICAgICAgbUVuY1BhcmFtcy5zX2NvbmZpZ19wcm1zLmk0X3JhdGVfY29udHJvbF9tb2RlID0gMzsKLSAgICAgICAgICAgIG1FbmNQYXJhbXMuc190Z3RfbHlyX3BybXMuYXNfdGd0X3BhcmFtc1swXS5haTRfZnJhbWVfcXBbMF0gPQotICAgICAgICAgICAgICAgIGdldFFwRnJvbVF1YWxpdHkobVF1YWxpdHktPnZhbHVlKTsKKyAgICAvLyB3ZSByZXNvbHZlZCBvdXQtb2YtYm91bmQgYW5kIHVuc3BlY2lmaWVkIHZhbHVlcyBpbiBQaWN0dXJlUXVhbnRpemF0aW9uU2V0dGVyKCkKKyAgICAvLyBzbyB3ZSBjYW4gc3RhcnQgd2l0aCBkZWZhdWx0cyB0aGF0IGFyZSBvdmVycmlkZGVuIGFzIG5lZWRlZC4KKyAgICBpbnQzMl90IG1heEZyYW1lUVAgPSBtRW5jUGFyYW1zLnNfY29uZmlnX3BybXMuaTRfbWF4X2ZyYW1lX3FwOworICAgIGludDMyX3QgbWluRnJhbWVRUCA9IG1FbmNQYXJhbXMuc19jb25maWdfcHJtcy5pNF9taW5fZnJhbWVfcXA7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1RcEJvdW5kcy0+ZmxleENvdW50KCk7ICsraSkgeworICAgICAgICBjb25zdCBDMlBpY3R1cmVRdWFudGl6YXRpb25TdHJ1Y3QgJmxheWVyID0gbVFwQm91bmRzLT5tLnZhbHVlc1tpXTsKKworICAgICAgICAvLyBubyBuZWVkIHRvIGxvb3AsIGhldmMgbGlicmFyeSB0YWtlcyBzYW1lIHJhbmdlIGZvciBJL1AvQiBwaWN0dXJlIHR5cGUKKyAgICAgICAgaWYgKGxheWVyLnR5cGVfID09IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChJX0ZSQU1FKSB8fAorICAgICAgICAgICAgbGF5ZXIudHlwZV8gPT0gQzJDb25maWc6OnBpY3R1cmVfdHlwZV90KFBfRlJBTUUpIHx8CisgICAgICAgICAgICBsYXllci50eXBlXyA9PSBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoQl9GUkFNRSkpIHsKKworICAgICAgICAgICAgbWF4RnJhbWVRUCA9IGxheWVyLm1heDsKKyAgICAgICAgICAgIG1pbkZyYW1lUVAgPSBsYXllci5taW47CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBtRW5jUGFyYW1zLnNfY29uZmlnX3BybXMuaTRfbWF4X2ZyYW1lX3FwID0gbWF4RnJhbWVRUDsKKyAgICBtRW5jUGFyYW1zLnNfY29uZmlnX3BybXMuaTRfbWluX2ZyYW1lX3FwID0gbWluRnJhbWVRUDsKKworICAgIEFMT0dWKCJNYXhGcmFtZVFwOiAlZCBNaW5GcmFtZVFwOiAlZCIsIG1heEZyYW1lUVAsIG1pbkZyYW1lUVApOworCisgICAgbUVuY1BhcmFtcy5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmFpNF9mcmFtZV9xcFswXSA9CisgICAgICAgIHN0ZDo6Y2xhbXAoa0RlZmF1bHRJbml0UVAsIG1pbkZyYW1lUVAsIG1heEZyYW1lUVApOworCisgICAgc3dpdGNoIChtQml0cmF0ZU1vZGUtPnZhbHVlKSB7CisgICAgICAgIGNhc2UgQzJDb25maWc6OkJJVFJBVEVfSUdOT1JFOiB7CisgICAgICAgICAgICBtRW5jUGFyYW1zLnNfY29uZmlnX3BybXMuaTRfcmF0ZV9jb250cm9sX21vZGUgPSAzOworICAgICAgICAgICAgLy8gZW5zdXJlIGluaXRpYWwgcXAgdmFsdWVzIGFyZSB3aXRoaW4gb3VyIG5ld2x5IGNvbmZpZ3VyZWQgYm91bmRzCisgICAgICAgICAgICBpbnQzMl90IGZyYW1lUXAgPSBnZXRRcEZyb21RdWFsaXR5KG1RdWFsaXR5LT52YWx1ZSk7CisgICAgICAgICAgICBtRW5jUGFyYW1zLnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uYWk0X2ZyYW1lX3FwWzBdID0KKyAgICAgICAgICAgICAgICBzdGQ6OmNsYW1wKGZyYW1lUXAsIG1pbkZyYW1lUVAsIG1heEZyYW1lUVApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgICAgY2FzZSBDMkNvbmZpZzo6QklUUkFURV9DT05TVDoKICAgICAgICAgICAgIG1FbmNQYXJhbXMuc19jb25maWdfcHJtcy5pNF9yYXRlX2NvbnRyb2xfbW9kZSA9IDU7CiAgICAgICAgICAgICBicmVhazsKQEAgLTcyMyw2ICs4MjYsNyBAQAogICAgICAgICBtR29wID0gbUludGYtPmdldEdvcF9sKCk7CiAgICAgICAgIG1SZXF1ZXN0U3luYyA9IG1JbnRmLT5nZXRSZXF1ZXN0U3luY19sKCk7CiAgICAgICAgIG1Db2xvckFzcGVjdHMgPSBtSW50Zi0+Z2V0Q29kZWRDb2xvckFzcGVjdHNfbCgpOworICAgICAgICBtUXBCb3VuZHMgPSBtSW50Zi0+Z2V0UGljdHVyZVF1YW50aXphdGlvbl9sKCk7OwogICAgIH0KIAogICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGluaXRFbmNQYXJhbXMoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0VuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmgKaW5kZXggOWRiZjY4Mi4uNDIxN2E4YiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmgKQEAgLTQyLDYgKzQyLDExIEBACiAjZGVmaW5lIERFRkFVTFRfQl9GUkFNRVMgICAgIDAKICNkZWZpbmUgREVGQVVMVF9SQ19MT09LQUhFQUQgMAogCisjZGVmaW5lIEhFVkNfUVBfTUlOIDEKKyNkZWZpbmUgSEVWQ19RUF9NQVggNTEKKworY29uc3RleHByIGludDMyX3Qga0RlZmF1bHRJbml0UVAgPSAzMjsKKwogc3RydWN0IEMyU29mdEhldmNFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgewogICAgIGNsYXNzIEludGZJbXBsOwogCkBAIC05MCw2ICs5NSw3IEBACiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtR29wVHVuaW5nOjpvdXRwdXQ+IG1Hb3A7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiBtUmVxdWVzdFN5bmM7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBtQ29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVRdWFudGl6YXRpb25UdW5pbmc6Om91dHB1dD4gbVFwQm91bmRzOwogI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKICAgICBjaGFyIG1JbkZpbGVbMjAwXTsKICAgICBjaGFyIG1PdXRGaWxlWzIwMF07CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuY3BwCmluZGV4IGUzOTQ2NzAuLjE0OWM2ZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuY3BwCkBAIC0zMjEsNiArMzIxLDEzIEBACiAgICAgcmV0dXJuIEMyX09LOwogfQogCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKwogLy8gVE9ETzogQ2FuIG92ZXJhbGwgZXJyb3IgY2hlY2tpbmcgYmUgaW1wcm92ZWQ/IEFzIGluIHRoZSBjaGVjayBmb3IgdmFsaWRpdHkgb2YKIC8vICAgICAgIHdvcmssIHBvb2wgcHRyLCB3b3JrLT5pbnB1dC5idWZmZXJzLnNpemUoKSA9PSAxLCAuLi4KIC8vIFRPRE86IEJsaW5kIHJlbW92YWwgb2YgNTI5IHNhbXBsZXMgZnJvbSB0aGUgb3V0cHV0IG1heSBub3Qgd29yay4gQmVjYXVzZQpAQCAtNDg2LDE3ICs0OTMsMTcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGludDY0X3Qgb3V0VGltZVN0YW1wID0gbVByb2Nlc3NlZFNhbXBsZXMgKiAxMDAwMDAwbGwgLyBzYW1wbGluZ1JhdGU7Ci0gICAgbVByb2Nlc3NlZFNhbXBsZXMgKz0gKChvdXRTaXplIC0gb3V0T2Zmc2V0KSAvIChudW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KSkpOwotICAgIEFMT0dWKCJvdXQgYnVmZmVyIGF0dHIuIG9mZnNldCAlZCBzaXplICVkIHRpbWVzdGFtcCAlIiBQUklkNjQgIiAiLCBvdXRPZmZzZXQsCi0gICAgICAgICAgb3V0U2l6ZSAtIG91dE9mZnNldCwgbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcCk7Ci0gICAgZGVjb2RlZFNpemVzLmNsZWFyKCk7Ci0gICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7Ci0gICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKLSAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soCi0gICAgICAgICAgICBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIG91dE9mZnNldCwgb3V0U2l6ZSAtIG91dE9mZnNldCkpOwotICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKLSAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOworICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgaWYgKHNhbXBsaW5nUmF0ZSAmJiBudW1DaGFubmVscykgeworICAgICAgICBpbnQ2NF90IG91dFRpbWVTdGFtcCA9IG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gc2FtcGxpbmdSYXRlOworICAgICAgICBtUHJvY2Vzc2VkU2FtcGxlcyArPSAoKG91dFNpemUgLSBvdXRPZmZzZXQpIC8gKG51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKSk7CisgICAgICAgIEFMT0dWKCJvdXQgYnVmZmVyIGF0dHIuIG9mZnNldCAlZCBzaXplICVkIHRpbWVzdGFtcCAlIiBQUklkNjQgIiAiLCBvdXRPZmZzZXQsCisgICAgICAgICAgICAgICBvdXRTaXplIC0gb3V0T2Zmc2V0LCBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wKTsKKyAgICAgICAgZGVjb2RlZFNpemVzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIG91dE9mZnNldCwgb3V0U2l6ZSAtIG91dE9mZnNldCkpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOworICAgIH0KICAgICBpZiAoZW9zKSB7CiAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOwogICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuY3BwCmluZGV4IGIxY2YzODguLjVmOWIzMGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5jcHAKQEAgLTU3Miw3ICs1NzIsNyBAQAogICAgIGlmIChPSyAhPSBjcmVhdGVEZWNvZGVyKCkpIHJldHVybiBVTktOT1dOX0VSUk9SOwogCiAgICAgbU51bUNvcmVzID0gTUlOKGdldENwdUNvcmVDb3VudCgpLCBNQVhfTlVNX0NPUkVTKTsKLSAgICBtU3RyaWRlID0gQUxJR04zMihtV2lkdGgpOworICAgIG1TdHJpZGUgPSBBTElHTjEyOChtV2lkdGgpOwogICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOwogICAgIHJlc2V0UGx1Z2luKCk7CiAgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CkBAIC04NDUsMjAgKzg0NSwyMCBAQAogICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOwogICAgIH0KICAgICBpZiAobU91dEJsb2NrICYmCi0gICAgICAgICAgICAobU91dEJsb2NrLT53aWR0aCgpICE9IEFMSUdOMzIobVdpZHRoKSB8fCBtT3V0QmxvY2stPmhlaWdodCgpICE9IG1IZWlnaHQpKSB7CisgICAgICAgICAgICAobU91dEJsb2NrLT53aWR0aCgpICE9IEFMSUdOMTI4KG1XaWR0aCkgfHwgbU91dEJsb2NrLT5oZWlnaHQoKSAhPSBtSGVpZ2h0KSkgewogICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKICAgICB9CiAgICAgaWYgKCFtT3V0QmxvY2spIHsKICAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOwogICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CiAgICAgICAgIGMyX3N0YXR1c190IGVyciA9Ci0gICAgICAgICAgICBwb29sLT5mZXRjaEdyYXBoaWNCbG9jayhBTElHTjMyKG1XaWR0aCksIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZtT3V0QmxvY2spOworICAgICAgICAgICAgcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soQUxJR04xMjgobVdpZHRoKSwgbUhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJm1PdXRCbG9jayk7CiAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgICAgIEFMT0dWKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCkiLAotICAgICAgICAgICAgICBtT3V0QmxvY2stPndpZHRoKCksIG1PdXRCbG9jay0+aGVpZ2h0KCksIEFMSUdOMzIobVdpZHRoKSwgbUhlaWdodCk7CisgICAgICAgICAgICAgIG1PdXRCbG9jay0+d2lkdGgoKSwgbU91dEJsb2NrLT5oZWlnaHQoKSwgQUxJR04xMjgobVdpZHRoKSwgbUhlaWdodCk7CiAgICAgfQogCiAgICAgcmV0dXJuIEMyX09LOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmgKaW5kZXggZmQ2NjMwNGEuLjhhMjljMTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuaApAQCAtMzcsNyArMzcsNyBAQAogI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCAgIGltcGVnMmRfY3RsX3NldF9udW1fY29yZXNfb3BfdAogI2RlZmluZSBpdmRleHRfY3RsX2dldF9zZXFfaW5mb19pcF90ICAgIGltcGVnMmRfY3RsX2dldF9zZXFfaW5mb19pcF90CiAjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3NlcV9pbmZvX29wX3QgICAgaW1wZWcyZF9jdGxfZ2V0X3NlcV9pbmZvX29wX3QKLSNkZWZpbmUgQUxJR04zMih4KSAgICAgICAgICAgICAgICAgICAgICAoKCgoeCkgKyAzMSkgPj4gNSkgPDwgNSkKKyNkZWZpbmUgQUxJR04xMjgoeCkgICAgICAgICAgICAgICAgICAgICAoKCgoeCkgKyAxMjcpID4+IDcpIDw8IDcpCiAjZGVmaW5lIE1BWF9OVU1fQ09SRVMgICAgICAgICAgICAgICAgICAgNAogI2RlZmluZSBJVkRFWFRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTICAgIFwKICAgICAgICAgKElWRF9DT05UUk9MX0FQSV9DT01NQU5EX1RZUEVfVClJTVBFRzJEX0NNRF9DVExfU0VUX05VTV9DT1JFUwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcAppbmRleCBkZGQzMTJmLi44MWY0Njc5IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcApAQCAtMjI4LDcgKzIyOCw2IEBACiAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQogICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKICAgICAgIG1JbnRmKGludGZJbXBsKSwKLSAgICAgIG1EZWNIYW5kbGUobnVsbHB0ciksCiAgICAgICBtT3V0cHV0QnVmZmVye30sCiAgICAgICBtSW5pdGlhbGl6ZWQoZmFsc2UpIHsKIH0KQEAgLTI0NCw5ICsyNDMsNyBAQAogCiBjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNERlYzo6b25TdG9wKCkgewogICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgaWYgKG1EZWNIYW5kbGUpIHsKLSAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKLSAgICAgICAgfQorICAgICAgICBQVkNsZWFuVXBWaWRlb0RlY29kZXIoJm1WaWRlb0RlY0NvbnRyb2xzKTsKICAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CiAgICAgfQogICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtOdW1PdXRwdXRCdWZmZXJzOyArK2kpIHsKQEAgLTI2OSwyOCArMjY2LDE1IEBACiB9CiAKIHZvaWQgQzJTb2Z0TXBlZzREZWM6Om9uUmVsZWFzZSgpIHsKLSAgICBpZiAobUluaXRpYWxpemVkKSB7Ci0gICAgICAgIGlmIChtRGVjSGFuZGxlKSB7Ci0gICAgICAgICAgICBQVkNsZWFuVXBWaWRlb0RlY29kZXIobURlY0hhbmRsZSk7Ci0gICAgICAgICAgICBkZWxldGUgbURlY0hhbmRsZTsKLSAgICAgICAgICAgIG1EZWNIYW5kbGUgPSBudWxscHRyOwotICAgICAgICB9Ci0gICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOwotICAgIH0KKyAgICAodm9pZClvblN0b3AoKTsKICAgICBpZiAobU91dEJsb2NrKSB7CiAgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOwogICAgIH0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBrTnVtT3V0cHV0QnVmZmVyczsgKytpKSB7Ci0gICAgICAgIGlmIChtT3V0cHV0QnVmZmVyW2ldKSB7Ci0gICAgICAgICAgICBmcmVlKG1PdXRwdXRCdWZmZXJbaV0pOwotICAgICAgICAgICAgbU91dHB1dEJ1ZmZlcltpXSA9IG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICB9CiB9CiAKIGMyX3N0YXR1c190IEMyU29mdE1wZWc0RGVjOjpvbkZsdXNoX3NtKCkgewogICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgaWYgKFBWX1RSVUUgIT0gUFZSZXNldFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKSkgeworICAgICAgICBpZiAoUFZfVFJVRSAhPSBQVlJlc2V0VmlkZW9EZWNvZGVyKCZtVmlkZW9EZWNDb250cm9scykpIHsKICAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMDUsMTQgKzI4OSw4IEBACiAjZWxzZQogICAgIG1Jc01wZWc0ID0gZmFsc2U7CiAjZW5kaWYKLSAgICBpZiAoIW1EZWNIYW5kbGUpIHsKLSAgICAgICAgbURlY0hhbmRsZSA9IG5ldyB0YWd2aWRlb0RlY0NvbnRyb2xzOwotICAgIH0KLSAgICBpZiAoIW1EZWNIYW5kbGUpIHsKLSAgICAgICAgQUxPR0UoIm1EZWNIYW5kbGUgaXMgbnVsbCIpOwotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLSAgICBtZW1zZXQobURlY0hhbmRsZSwgMCwgc2l6ZW9mKHRhZ3ZpZGVvRGVjQ29udHJvbHMpKTsKKworICAgIG1lbXNldCgmbVZpZGVvRGVjQ29udHJvbHMsIDAsIHNpemVvZih0YWd2aWRlb0RlY0NvbnRyb2xzKSk7CiAKICAgICAvKiBUT0RPOiBicmluZyB0aGVzZSB2YWx1ZXMgdG8gMzUyIGFuZCAyODguIEl0IGNhbm5vdCBiZSBkb25lIGFzIG9mIG5vdwogICAgICAqIGJlY2F1c2UsIGgyNjMgZG9lc24ndCBzZWVtIHRvIGFsbG93IHBvcnQgcmVjb25maWd1cmF0aW9uLiBJbiBPTVgsIHRoZQpAQCAtMzY4LDEwICszNDYsNiBAQAogfQogCiBjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNERlYzo6ZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKLSAgICBpZiAoIW1EZWNIYW5kbGUpIHsKLSAgICAgICAgQUxPR0UoIm5vdCBzdXBwb3NlZCB0byBiZSBoZXJlLCBpbnZhbGlkIGRlY29kZXIgY29udGV4dCIpOwotICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOwotICAgIH0KIAogICAgIG1PdXRwdXRCdWZmZXJTaXplID0gYWxpZ24obUludGYtPmdldE1heFdpZHRoKCksIDE2KSAqIGFsaWduKG1JbnRmLT5nZXRNYXhIZWlnaHQoKSwgMTYpICogMyAvIDI7CiAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwga051bU91dHB1dEJ1ZmZlcnM7ICsraSkgewpAQCAtNDAyLDEwICszNzYsMTAgQEAKIAogYm9vbCBDMlNvZnRNcGVnNERlYzo6aGFuZGxlUmVzQ2hhbmdlKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CiAgICAgdWludDMyX3QgZGlzcF93aWR0aCwgZGlzcF9oZWlnaHQ7Ci0gICAgUFZHZXRWaWRlb0RpbWVuc2lvbnMobURlY0hhbmRsZSwgKGludDMyICopJmRpc3Bfd2lkdGgsIChpbnQzMiAqKSZkaXNwX2hlaWdodCk7CisgICAgUFZHZXRWaWRlb0RpbWVuc2lvbnMoJm1WaWRlb0RlY0NvbnRyb2xzLCAoaW50MzIgKikmZGlzcF93aWR0aCwgKGludDMyICopJmRpc3BfaGVpZ2h0KTsKIAogICAgIHVpbnQzMl90IGJ1Zl93aWR0aCwgYnVmX2hlaWdodDsKLSAgICBQVkdldEJ1ZmZlckRpbWVuc2lvbnMobURlY0hhbmRsZSwgKGludDMyICopJmJ1Zl93aWR0aCwgKGludDMyICopJmJ1Zl9oZWlnaHQpOworICAgIFBWR2V0QnVmZmVyRGltZW5zaW9ucygmbVZpZGVvRGVjQ29udHJvbHMsIChpbnQzMiAqKSZidWZfd2lkdGgsIChpbnQzMiAqKSZidWZfaGVpZ2h0KTsKIAogICAgIENIRUNLX0xFKGRpc3Bfd2lkdGgsIGJ1Zl93aWR0aCk7CiAgICAgQ0hFQ0tfTEUoZGlzcF9oZWlnaHQsIGJ1Zl9oZWlnaHQpOwpAQCAtNDI2LDEzICs0MDAsMTQgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICghbUlzTXBlZzQpIHsKLSAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcigmbVZpZGVvRGVjQ29udHJvbHMpOwogCiAgICAgICAgICAgICB1aW50OF90ICp2b2xfZGF0YVsxXXt9OwogICAgICAgICAgICAgaW50MzJfdCB2b2xfc2l6ZSA9IDA7CiAKICAgICAgICAgICAgIGlmICghUFZJbml0VmlkZW9EZWNvZGVyKAotICAgICAgICAgICAgICAgICAgICBtRGVjSGFuZGxlLCB2b2xfZGF0YSwgJnZvbF9zaXplLCAxLCBtSW50Zi0+Z2V0TWF4V2lkdGgoKSwgbUludGYtPmdldE1heEhlaWdodCgpLCBIMjYzX01PREUpKSB7CisgICAgICAgICAgICAgICAgICAgICZtVmlkZW9EZWNDb250cm9scywgdm9sX2RhdGEsICZ2b2xfc2l6ZSwgMSwgbUludGYtPmdldE1heFdpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRmLT5nZXRNYXhIZWlnaHQoKSwgSDI2M19NT0RFKSkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBQVkluaXRWaWRlb0RlY29kZXIgSDI2M19NT0RFIHdoaWxlIHJlc0NoYW5nZWQgd2FzIHNldCB0byB0cnVlIik7CiAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CkBAIC01MjIsNyArNDk3LDcgQEAKICAgICB1aW50MzJfdCAqc3RhcnRfY29kZSA9ICh1aW50MzJfdCAqKWJpdHN0cmVhbTsKICAgICBib29sIHZvbEhlYWRlciA9ICpzdGFydF9jb2RlID09IDB4QjAwMTAwMDA7CiAgICAgaWYgKHZvbEhlYWRlcikgewotICAgICAgICBQVkNsZWFuVXBWaWRlb0RlY29kZXIobURlY0hhbmRsZSk7CisgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcigmbVZpZGVvRGVjQ29udHJvbHMpOwogICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgICB9CiAKQEAgLTUzNyw3ICs1MTIsNyBAQAogICAgICAgICB9CiAgICAgICAgIE1QNERlY29kaW5nTW9kZSBtb2RlID0gKG1Jc01wZWc0KSA/IE1QRUc0X01PREUgOiBIMjYzX01PREU7CiAgICAgICAgIGlmICghUFZJbml0VmlkZW9EZWNvZGVyKAotICAgICAgICAgICAgICAgIG1EZWNIYW5kbGUsIHZvbF9kYXRhLCAmdm9sX3NpemUsIDEsCisgICAgICAgICAgICAgICAgJm1WaWRlb0RlY0NvbnRyb2xzLCB2b2xfZGF0YSwgJnZvbF9zaXplLCAxLAogICAgICAgICAgICAgICAgIG1JbnRmLT5nZXRNYXhXaWR0aCgpLCBtSW50Zi0+Z2V0TWF4SGVpZ2h0KCksIG1vZGUpKSB7CiAgICAgICAgICAgICBBTE9HRSgiUFZJbml0VmlkZW9EZWNvZGVyIGZhaWxlZC4gVW5zdXBwb3J0ZWQgY29udGVudD8iKTsKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CkBAIC01NDUsNyArNTIwLDcgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgICAgICBNUDREZWNvZGluZ01vZGUgYWN0dWFsTW9kZSA9IFBWR2V0RGVjQml0c3RyZWFtTW9kZShtRGVjSGFuZGxlKTsKKyAgICAgICAgTVA0RGVjb2RpbmdNb2RlIGFjdHVhbE1vZGUgPSBQVkdldERlY0JpdHN0cmVhbU1vZGUoJm1WaWRlb0RlY0NvbnRyb2xzKTsKICAgICAgICAgaWYgKG1vZGUgIT0gYWN0dWFsTW9kZSkgewogICAgICAgICAgICAgQUxPR0UoIkRlY29kZWQgbW9kZSBub3Qgc2FtZSBhcyBhY3R1YWwgbW9kZSBvZiB0aGUgZGVjb2RlciIpOwogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKQEAgLTU1Myw3ICs1MjgsNyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgUFZTZXRQb3N0UHJvY1R5cGUobURlY0hhbmRsZSwgMCk7CisgICAgICAgIFBWU2V0UG9zdFByb2NUeXBlKCZtVmlkZW9EZWNDb250cm9scywgMCk7CiAgICAgICAgIGlmIChoYW5kbGVSZXNDaGFuZ2Uod29yaykpIHsKICAgICAgICAgICAgIEFMT0dJKCJTZXR0aW5nIHdpZHRoIGFuZCBoZWlnaHQiKTsKICAgICAgICAgICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKQEAgLTU5MCw3ICs1NjUsNyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgdWludDMyX3QgeUZyYW1lU2l6ZSA9IHNpemVvZih1aW50OCkgKiBtRGVjSGFuZGxlLT5zaXplOworICAgICAgICB1aW50MzJfdCB5RnJhbWVTaXplID0gc2l6ZW9mKHVpbnQ4KSAqIG1WaWRlb0RlY0NvbnRyb2xzLnNpemU7CiAgICAgICAgIGlmIChtT3V0cHV0QnVmZmVyU2l6ZSA8IHlGcmFtZVNpemUgKiAzIC8gMil7CiAgICAgICAgICAgICBBTE9HRSgiVG9vIHNtYWxsIG91dHB1dCBidWZmZXI6ICV6dSBieXRlcyIsIG1PdXRwdXRCdWZmZXJTaXplKTsKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CkBAIC01OTksNyArNTc0LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICghbUZyYW1lc0NvbmZpZ3VyZWQpIHsKLSAgICAgICAgICAgIFBWU2V0UmVmZXJlbmNlWVVWKG1EZWNIYW5kbGUsbU91dHB1dEJ1ZmZlclsxXSk7CisgICAgICAgICAgICBQVlNldFJlZmVyZW5jZVlVVigmbVZpZGVvRGVjQ29udHJvbHMsbU91dHB1dEJ1ZmZlclsxXSk7CiAgICAgICAgICAgICBtRnJhbWVzQ29uZmlndXJlZCA9IHRydWU7CiAgICAgICAgIH0KIApAQCAtNjEwLDcgKzU4NSw3IEBACiAgICAgICAgIHVpbnQ4X3QgKmJpdHN0cmVhbVRtcCA9IGJpdHN0cmVhbTsKICAgICAgICAgdWludDMyX3QgdGltZXN0YW1wID0gd29ya0luZGV4OwogICAgICAgICBpZiAoUFZEZWNvZGVWb3BIZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgIG1EZWNIYW5kbGUsICZiaXRzdHJlYW1UbXAsICZ0aW1lc3RhbXAsICZ0bXBJblNpemUsCisgICAgICAgICAgICAgICAgICAgICZtVmlkZW9EZWNDb250cm9scywgJmJpdHN0cmVhbVRtcCwgJnRpbWVzdGFtcCwgJnRtcEluU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgJmhlYWRlcl9pbmZvLCAmdXNlRXh0VGltZXN0YW1wLAogICAgICAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW21OdW1TYW1wbGVzT3V0cHV0ICYgMV0pICE9IFBWX1RSVUUpIHsKICAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZGVjb2RlIHZvcCBoZWFkZXIuIik7CkBAIC02NDIsNyArNjE3LDcgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKFBWRGVjb2RlVm9wQm9keShtRGVjSGFuZGxlLCAmdG1wSW5TaXplKSAhPSBQVl9UUlVFKSB7CisgICAgICAgIGlmIChQVkRlY29kZVZvcEJvZHkoJm1WaWRlb0RlY0NvbnRyb2xzLCAmdG1wSW5TaXplKSAhPSBQVl9UUlVFKSB7CiAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGRlY29kZSB2aWRlbyBmcmFtZS4iKTsKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmgKaW5kZXggNzE2YTA5NS4uZmVkMDRjOSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5oCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuaApAQCAtMTksOCArMTksOCBAQAogCiAjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KIAorI2luY2x1ZGUgPG1wNGRlY19hcGkuaD4KIAotc3RydWN0IHRhZ3ZpZGVvRGVjQ29udHJvbHM7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNTQsNyArNTQsNyBAQAogICAgIGJvb2wgaGFuZGxlUmVzQ2hhbmdlKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKIAogICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7Ci0gICAgdGFndmlkZW9EZWNDb250cm9scyAqbURlY0hhbmRsZTsKKyAgICB0YWd2aWRlb0RlY0NvbnRyb2xzIG1WaWRlb0RlY0NvbnRyb2xzOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gbU91dEJsb2NrOwogICAgIHVpbnQ4X3QgKm1PdXRwdXRCdWZmZXJba051bU91dHB1dEJ1ZmZlcnNdOwogICAgIHNpemVfdCAgbU91dHB1dEJ1ZmZlclNpemU7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuY3BwCmluZGV4IDNjODc1MzEuLjNiZmVjNjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuY3BwCkBAIC00MzYsMTYgKzQzNiwxOCBAQAogICAgICAgICB9CiAKICAgICAgICAgKyttTnVtSW5wdXRGcmFtZXM7Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PiBjc2QgPQotICAgICAgICAgICAgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dDo6QWxsb2NVbmlxdWUob3V0cHV0U2l6ZSwgMHUpOwotICAgICAgICBpZiAoIWNzZCkgewotICAgICAgICAgICAgQUxPR0UoIkNTRCBhbGxvY2F0aW9uIGZhaWxlZCIpOwotICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKG91dHB1dFNpemUpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PiBjc2QgPQorICAgICAgICAgICAgICAgIEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKG91dHB1dFNpemUsIDB1KTsKKyAgICAgICAgICAgIGlmICghY3NkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNTRCBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShjc2QtPm0udmFsdWUsIG91dFB0ciwgb3V0cHV0U2l6ZSk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhzdGQ6Om1vdmUoY3NkKSk7CiAgICAgICAgIH0KLSAgICAgICAgbWVtY3B5KGNzZC0+bS52YWx1ZSwgb3V0UHRyLCBvdXRwdXRTaXplKTsKLSAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKGNzZCkpOwogICAgIH0KIAogICAgIC8vIGhhbmRsZSBkeW5hbWljIGJpdHJhdGUgY2hhbmdlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwCmluZGV4IDI5NTNkOTAuLjJkYTlkNWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwCkBAIC0yNSw2ICsyNSw3IEBACiAKICNpbmNsdWRlIDxDMkRlYnVnLmg+CiAjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJCdWZmZXJVdGlscy5oPgogI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CiAKICNpbmNsdWRlICJDMlNvZnRWcHhEZWMuaCIKQEAgLTE0OSw4ICsxNTAsMTYgQEAKICNlbHNlCiAgICAgICAgIGFkZFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQotICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX1VOVVNFRCwgQzJDb25maWc6OkxFVkVMX1VOVVNFRCkpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfVlA4XzAsIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLmVxdWFsVG8oCisgICAgICAgICAgICAgICAgICAgICAgICBQUk9GSUxFX1ZQOF8wCisgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkuZXF1YWxUbygKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX1VOVVNFRCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplKQogICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKICNlbmRpZgogCkBAIC0zNDMsNiArMzUyLDcgQEAKICAgICAgIG1Db2RlY0N0eChudWxscHRyKSwKICAgICAgIG1Db3JlQ291bnQoMSksCiAgICAgICBtUXVldWUobmV3IE11dGV4ZWQ8Q29udmVyc2lvblF1ZXVlPikgeworICAgICAgbUlzRm9ybWF0UjEwRzEwQjEwQTJTdXBwb3J0ZWQgPSBJc0Zvcm1hdFIxMEcxMEIxMEEyU3VwcG9ydGVkRm9yTGVnYWN5UmVuZGVyaW5nKCk7CiB9CiAKIEMyU29mdFZweERlYzo6fkMyU29mdFZweERlYygpIHsKQEAgLTc5Niw3ICs4MDYsMTQgQEAKICAgICAgICAgaWYgKGRlZmF1bHRDb2xvckFzcGVjdHMtPnByaW1hcmllcyA9PSBDMkNvbG9yOjpQUklNQVJJRVNfQlQyMDIwICYmCiAgICAgICAgICAgICBkZWZhdWx0Q29sb3JBc3BlY3RzLT5tYXRyaXggPT0gQzJDb2xvcjo6TUFUUklYX0JUMjAyMCAmJgogICAgICAgICAgICAgZGVmYXVsdENvbG9yQXNwZWN0cy0+dHJhbnNmZXIgPT0gQzJDb2xvcjo6VFJBTlNGRVJfU1QyMDg0KSB7Ci0gICAgICAgICAgICBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMjsKKyAgICAgICAgICAgIC8vIFRPRE8gKGIvMjAxNzg3OTU2KSBGb3IgZGV2aWNlcyB0aGF0IGRvIG5vdCBzdXBwb3J0IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyLAorICAgICAgICAgICAgLy8gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyIGlzIHVzZWQgYXMgYSB0ZW1wb3Jhcnkgd29yayBhcm91bmQuCisgICAgICAgICAgICBpZiAoIW1Jc0Zvcm1hdFIxMEcxMEIxMEEyU3VwcG9ydGVkKSAgeworICAgICAgICAgICAgICAgIEFMT0dFKCJIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMiBpc24ndCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuaAppbmRleCAyMDY1MTY1Li5hZGUxNjJkIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5oCkBAIC04MCw3ICs4MCw3IEBACiAgICAgfTsKICAgICBzdGQ6OnNoYXJlZF9wdHI8TXV0ZXhlZDxDb252ZXJzaW9uUXVldWU+PiBtUXVldWU7CiAgICAgc3RkOjp2ZWN0b3I8c3A8Q29udmVydGVyVGhyZWFkPj4gbUNvbnZlcnRlclRocmVhZHM7Ci0KKyAgICBib29sIG1Jc0Zvcm1hdFIxMEcxMEIxMEEyU3VwcG9ydGVkOwogICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CiAgICAgc3RhdHVzX3QgZGVzdHJveURlY29kZXIoKTsKICAgICB2b2lkIGZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmNwcAppbmRleCA3NDg2ZDI3Li42MTc3NjliIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmNwcApAQCAtMzEsNiArMzEsMjU1IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorQzJTb2Z0VnB4RW5jOjpJbnRmSW1wbDo6SW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+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+ICZjb2RlZCk7CiAKICAgIHByaXZhdGU6CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0PiBtVXNhZ2U7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29uZmlnLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29uZmlnLmgKaW5kZXggMmNjN2FiNy4uZmVhYTk4YyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkNvbmZpZy5oCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJDb25maWcuaApAQCAtMTY3Myw3ICsxNjczLDcgQEAKICAgICBTWU5DX0ZSQU1FID0gKDEgPDwgMCksICAvLy88IHN5bmMgZnJhbWUsIGUuZy4gSURSCiAgICAgSV9GUkFNRSAgICA9ICgxIDw8IDEpLCAgLy8vPCBpbnRyYSBmcmFtZSB0aGF0IGlzIGNvbXBsZXRlbHkgZW5jb2RlZAogICAgIFBfRlJBTUUgICAgPSAoMSA8PCAyKSwgIC8vLzwgaW50ZXIgcHJlZGljdGVkIGZyYW1lIGZyb20gcHJldmlvdXMgZnJhbWVzCi0gICAgQl9GUkFNRSAgICA9ICgxIDw8IDMpLCAgLy8vPCBiYWNrd2FyZCBwcmVkaWN0ZWQgKG91dC1vZi1vcmRlcikgZnJhbWUKKyAgICBCX0ZSQU1FICAgID0gKDEgPDwgMyksICAvLy88IGJpZGlyZWN0aW9uYWwgcHJlZGljdGVkIChvdXQtb2Ytb3JkZXIpIGZyYW1lCiApCiAKIC8qKgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2Z1enplci9DMkZ1enplci5jcHAgYi9tZWRpYS9jb2RlYzIvZnV6emVyL0MyRnV6emVyLmNwcAppbmRleCA1MWUxMDEzLi5lNDY5ZDhiIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvZnV6emVyL0MyRnV6emVyLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvZnV6emVyL0MyRnV6emVyLmNwcApAQCAtMTk0LDEyICsxOTQsMTIgQEAKICAgfQogCiAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBjb25maWdQYXJhbXM7CisgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dCBpbnB1dFNpemUoMHUsIGtXaWR0aE9mVmlkZW8sIGtIZWlnaHRPZlZpZGVvKTsKKyAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBrU2FtcGxpbmdSYXRlT2ZBdWRpbyk7CisgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIGtDaGFubmVsc09mQXVkaW8pOwogICBpZiAoZG9tYWluLnZhbHVlID09IERPTUFJTl9WSURFTykgewotICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dCBpbnB1dFNpemUoMHUsIGtXaWR0aE9mVmlkZW8sIGtIZWlnaHRPZlZpZGVvKTsKICAgICBjb25maWdQYXJhbXMucHVzaF9iYWNrKCZpbnB1dFNpemUpOwogICB9IGVsc2UgaWYgKGRvbWFpbi52YWx1ZSA9PSBET01BSU5fQVVESU8pIHsKLSAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIGtTYW1wbGluZ1JhdGVPZkF1ZGlvKTsKLSAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCBjaGFubmVsQ291bnRJbmZvKDB1LCBrQ2hhbm5lbHNPZkF1ZGlvKTsKICAgICBjb25maWdQYXJhbXMucHVzaF9iYWNrKCZzYW1wbGVSYXRlSW5mbyk7CiAgICAgY29uZmlnUGFyYW1zLnB1c2hfYmFjaygmY2hhbm5lbENvdW50SW5mbyk7CiAgIH0KQEAgLTIzOSwxNyArMjM5LDE3IEBACiB9CiAKIHZvaWQgQ29kZWMyRnV6emVyOjpkZWNvZGVGcmFtZXMoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgbUJ1ZmZlclNvdXJjZSA9IG5ldyBCdWZmZXJTb3VyY2UoZGF0YSwgc2l6ZSk7Ci0gIGlmICghbUJ1ZmZlclNvdXJjZSkgeworICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU291cmNlPiBidWZmZXJTb3VyY2UgPSBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclNvdXJjZT4oZGF0YSwgc2l6ZSk7CisgIGlmICghYnVmZmVyU291cmNlKSB7CiAgICAgcmV0dXJuOwogICB9Ci0gIG1CdWZmZXJTb3VyY2UtPnBhcnNlKCk7CisgIGJ1ZmZlclNvdXJjZS0+cGFyc2UoKTsKICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gQzJfT0s7CiAgIHNpemVfdCBudW1GcmFtZXMgPSAwOwotICB3aGlsZSAoIW1CdWZmZXJTb3VyY2UtPmlzRW9zKCkpIHsKKyAgd2hpbGUgKCFidWZmZXJTb3VyY2UtPmlzRW9zKCkpIHsKICAgICB1aW50OF90KiBmcmFtZSA9IG51bGxwdHI7CiAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IDA7Ci0gICAgRnJhbWVEYXRhIGZyYW1lRGF0YSA9IG1CdWZmZXJTb3VyY2UtPmdldEZyYW1lKCk7CisgICAgRnJhbWVEYXRhIGZyYW1lRGF0YSA9IGJ1ZmZlclNvdXJjZS0+Z2V0RnJhbWUoKTsKICAgICBmcmFtZSA9IHN0ZDo6Z2V0PDA+KGZyYW1lRGF0YSk7CiAgICAgZnJhbWVTaXplID0gc3RkOjpnZXQ8MT4oZnJhbWVEYXRhKTsKIApAQCAtMjk4LDcgKzI5OCw2IEBACiAgIG1Db25kaXRpb25hbFZhcmlhYmxlLndhaXRfZm9yKHdhaXRGb3JEZWNvZGVDb21wbGV0ZSwga0MyRnV6emVyVGltZU91dCwgW3RoaXNdIHsgcmV0dXJuIG1Fb3M7IH0pOwogICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGMyZmx1c2hlZFdvcmtzOwogICBtQ29tcG9uZW50LT5mbHVzaF9zbShDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmYzJmbHVzaGVkV29ya3MpOwotICBkZWxldGUgbUJ1ZmZlclNvdXJjZTsKIH0KIAogZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2Z1enplci9DMkZ1enplci5oIGIvbWVkaWEvY29kZWMyL2Z1enplci9DMkZ1enplci5oCmluZGV4IGQ1YWM4MWEuLmRhNzY4ODUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9mdXp6ZXIvQzJGdXp6ZXIuaAorKysgYi9tZWRpYS9jb2RlYzIvZnV6emVyL0MyRnV6emVyLmgKQEAgLTEwNCw3ICsxMDQsNiBAQAogICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXJrZXJTdWZmaXhTaXplID0gMzsKICAgfTsKIAotICBCdWZmZXJTb3VyY2UqIG1CdWZmZXJTb3VyY2U7CiAgIGJvb2wgbUVvcyA9IGZhbHNlOwogICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBtQmxvY2tQb29sSWQ7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvLmNsYW5nLWZvcm1hdCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvLmNsYW5nLWZvcm1hdApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMTM2Mjc5Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzLy5jbGFuZy1mb3JtYXQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi8uLi8uLi8uLi8uLi8uLi9idWlsZC9zb29uZy9zY3JpcHRzL3N5c3RlbS1jbGFuZy1mb3JtYXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL09XTkVSUyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvT1dORVJTCmluZGV4IGRiZTg5Y2YuLjMyYjExYjggMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvT1dORVJTCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvT1dORVJTCkBAIC0xLDggKzEsNSBAQAorIyBCdWcgY29tcG9uZW50OiAyNTY5MAogIyBNZWRpYSB0ZWFtCiBsYWpvc0Bnb29nbGUuY29tCi1wYXdpbkBnb29nbGUuY29tCiB0YWtsZWVAZ29vZ2xlLmNvbQogd29uc2lrQGdvb2dsZS5jb20KLQotIyBWVFMgdGVhbQotZHNoaUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0LmNwcAppbmRleCA5ZTNhODIzLi5kNDdlZjY3IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldEF1ZGlvRGVjVGVzdC5jcHAKQEAgLTQ2NSw2ICs0NjUsMTEgQEAKICAgICBpZiAobU1pbWUuZmluZCgicmF3IikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKICAgICAgICAgYml0U3RyZWFtSW5mb1swXSA9IDgwMDA7CiAgICAgICAgIGJpdFN0cmVhbUluZm9bMV0gPSAxOworICAgIH0gZWxzZSBpZiAoKG1NaW1lLmZpbmQoImc3MTEtYWxhdyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB8fAorICAgICAgICAgICAgICAgKG1NaW1lLmZpbmQoImc3MTEtbWxhdyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSkgeworICAgICAgICAvLyBnNzExIHRlc3QgZGF0YSBpcyBhbGwgMS1jaGFubmVsIGFuZCBoYXMgbm8gZW1iZWRkZWQgY29uZmlnIGluZm8uCisgICAgICAgIGJpdFN0cmVhbUluZm9bMF0gPSA4MDAwOworICAgICAgICBiaXRTdHJlYW1JbmZvWzFdID0gMTsKICAgICB9IGVsc2UgewogICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1NaW1lLCBiaXRTdHJlYW1JbmZvKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwCmluZGV4IGZmZWM4OTcuLjI3NWE3MjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0LmNwcAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tcG9uZW50L1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdC5jcHAKQEAgLTYxLDYgKzYxLDcgQEAKICAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKICAgICAgICAgZ2V0UGFyYW1zKCk7CisgICAgICAgIG1EaXNhYmxlVGVzdCA9IGZhbHNlOwogICAgICAgICBtRW9zID0gZmFsc2U7CiAgICAgICAgIG1DbGllbnQgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKG1JbnN0YW5jZU5hbWUuY19zdHIoKSk7CiAgICAgICAgIEFTU0VSVF9ORShtQ2xpZW50LCBudWxscHRyKTsKQEAgLTczLDYgKzc0LDE0IEBACiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0lOUFVUX0JVRkZFUlM7ICsraSkgewogICAgICAgICAgICAgbVdvcmtRdWV1ZS5lbXBsYWNlX2JhY2sobmV3IEMyV29yayk7CiAgICAgICAgIH0KKworICAgICAgICBDMlNlY3VyZU1vZGVUdW5pbmcgc2VjdXJlTW9kZVR1bmluZ3t9OworICAgICAgICBtQ29tcG9uZW50LT5xdWVyeSh7JnNlY3VyZU1vZGVUdW5pbmd9LCB7fSwgQzJfTUFZX0JMT0NLLCBudWxscHRyKTsKKyAgICAgICAgaWYgKHNlY3VyZU1vZGVUdW5pbmcudmFsdWUgIT0gQzJDb25maWc6OlNNX1VOUFJPVEVDVEVEKSB7CisgICAgICAgICAgICBtRGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1EaXNhYmxlVGVzdCkgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBEaXNhYmxlZCBcbiI7CiAgICAgfQogCiAgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewpAQCAtMTA1LDYgKzExNCw3IEBACiAgICAgc3RkOjpzdHJpbmcgbUluc3RhbmNlTmFtZTsKICAgICBzdGQ6OnN0cmluZyBtQ29tcG9uZW50TmFtZTsKICAgICBib29sIG1Fb3M7CisgICAgYm9vbCBtRGlzYWJsZVRlc3Q7CiAgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOwogICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CkBAIC0zMjQsNiArMzM0LDcgQEAKIH07CiAKIFRFU1RfUChDb2RlYzJDb21wb25lbnRJbnB1dFRlc3RzLCBJbnB1dEJ1ZmZlclRlc3QpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSBHVEVTVF9TS0lQKCkgPDwgIlRlc3QgaXMgZGlzYWJsZWQiOwogICAgIGRlc2NyaXB0aW9uKCJUZXN0cyBmb3IgZGlmZmVyZW50IGlucHV0cyIpOwogCiAgICAgdWludDMyX3QgZmxhZ3MgPSBzdGQ6OmdldDwyPihHZXRQYXJhbSgpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9GaWx0ZXJXcmFwcGVyLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9GaWx0ZXJXcmFwcGVyLmNwcAppbmRleCA3MGM2M2YyLi5iNjAyNGZmIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vRmlsdGVyV3JhcHBlci5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvcGx1Z2luL0ZpbHRlcldyYXBwZXIuY3BwCkBAIC00MzAsNiArNDMwLDEwIEBACiAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJXcmFwcGVkRGVjb2RlckludGVyZmFjZTogRmlsdGVyV3JhcHBlciBub3QgZm91bmQiOwogICAgICAgICAgICAgcmV0dXJuIEMyX09LOwogICAgICAgICB9CisgICAgICAgIGlmICghZmlsdGVyV3JhcHBlci0+aXNGaWx0ZXJpbmdFbmFibGVkKG5leHQpKSB7CisgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIldyYXBwZWREZWNvZGVySW50ZXJmYWNlOiBmaWx0ZXJpbmcgbm90IGVuYWJsZWQiOworICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICB9CiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOwogICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBmaWx0ZXJXcmFwcGVyLT5xdWVyeVBhcmFtc0ZvclByZXZpb3VzQ29tcG9uZW50KG5leHQsICZwYXJhbXMpOwogICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5icAppbmRleCBiYjlmNTFmLi5iMzZlODBhIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQuYnAKQEAgLTUyLDcgKzUyLDcgQEAKIAogICAgIC8vIG1pbmlqYWlsIGlzIHVzZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IHVuZXhwZWN0ZWQgc3lzdGVtIGNhbGxzLgogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhdnNlcnZpY2VzX21pbmlqYWlsX3ZlbmRvciIsCisgICAgICAgICJsaWJhdnNlcnZpY2VzX21pbmlqYWlsIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgXSwKICAgICByZXF1aXJlZDogWyJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMi1kZWZhdWx0LXNlY2NvbXBfcG9saWN5Il0sCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMi1kZWZhdWx0LXNlcnZpY2UucmMgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMi1kZWZhdWx0LXNlcnZpY2UucmMKaW5kZXggMDNmNmUzZC4uMTJkYTU5MyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjItZGVmYXVsdC1zZXJ2aWNlLnJjCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4yLWRlZmF1bHQtc2VydmljZS5yYwpAQCAtMyw1ICszLDUgQEAKICAgICB1c2VyIG1lZGlhY29kZWMKICAgICBncm91cCBjYW1lcmEgbWVkaWFkcm0gZHJtcnBjCiAgICAgaW9wcmlvIHJ0IDQKLSAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCisgICAgdGFza19wcm9maWxlcyBQcm9jZXNzQ2FwYWNpdHlIaWdoCiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5jcHAKaW5kZXggODI0NjBjOS4uNDRhMmM1YiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5jcHAKQEAgLTEzMzIsOCArMTMzMiw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLyBzZXQgY2hhbm5lbC1tYXNrCiAgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0FVRElPKSB7CisgICAgICAgICAgICAvLyBzZXQgY2hhbm5lbC1tYXNrCiAgICAgICAgICAgICBpbnQzMl90IG1hc2s7CiAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoS0VZX0NIQU5ORUxfTUFTSywgJm1hc2spKSB7CiAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikgewpAQCAtMTM0Miw2ICsxMzQyLDE1IEBACiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0NIQU5ORUxfTUFTSywgbWFzayk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzZXQgUENNIGVuY29kaW5nCisgICAgICAgICAgICBpbnQzMl90IHBjbUVuY29kaW5nID0ga0F1ZGlvRW5jb2RpbmdQY20xNmJpdDsKKyAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKEtFWV9QQ01fRU5DT0RJTkcsICZwY21FbmNvZGluZyk7CisgICAgICAgICAgICBpZiAoZW5jb2RlcikgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQzMigiYW5kcm9pZC5fY29uZmlnLXBjbS1lbmNvZGluZyIsIHBjbUVuY29kaW5nKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigiYW5kcm9pZC5fY29uZmlnLXBjbS1lbmNvZGluZyIsIHBjbUVuY29kaW5nKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBjb2xvclRyYW5zZmVyUmVxdWVzdFBhcmFtOwpAQCAtMTQyMSw2ICsxNDMwLDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoY29uZmlnLT5tVHVubmVsZWQpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+c2V0SW50MzIoImFuZHJvaWQuX3R1bm5lbGVkIiwgMSk7CisgICAgICAgIH0KKwogICAgICAgICBBTE9HRCgic2V0dXAgZm9ybWF0cyBpbnB1dDogJXMiLAogICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICBBTE9HRCgic2V0dXAgZm9ybWF0cyBvdXRwdXQ6ICVzIiwKQEAgLTE4OTYsOSArMTkwOSwxMSBAQAogICAgIHsKICAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPj46OkxvY2tlZCBjb25maWdMb2NrZWQobUNvbmZpZyk7CiAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+ICZjb25maWcgPSAqY29uZmlnTG9ja2VkOworICAgICAgICBzcDxBTmF0aXZlV2luZG93PiBuYXRpdmVXaW5kb3cgPSBzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93ICo+KHN1cmZhY2UuZ2V0KCkpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKwogICAgICAgICBpZiAoY29uZmlnLT5tVHVubmVsZWQgJiYgY29uZmlnLT5tU2lkZWJhbmRIYW5kbGUgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gbmF0aXZlV2luZG93ID0gc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyAqPihzdXJmYWNlLmdldCgpKTsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X3NpZGViYW5kX3N0cmVhbSgKKyAgICAgICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X3NpZGViYW5kX3N0cmVhbSgKICAgICAgICAgICAgICAgICAgICAgbmF0aXZlV2luZG93LmdldCgpLAogICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihjb25maWctPm1TaWRlYmFuZEhhbmRsZS0+aGFuZGxlKCkpKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTE5MDYsNiArMTkyMSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlV2luZG93LmdldCgpLCBjb25maWctPm1TaWRlYmFuZEhhbmRsZS0+aGFuZGxlKCksIGVycik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEV4cGxpY2l0bHkgcmVzZXQgdGhlIHNpZGViYW5kIGhhbmRsZSBvZiB0aGUgd2luZG93IGZvcgorICAgICAgICAgICAgLy8gbm9uLXR1bm5lbGVkIHZpZGVvIGluIGNhc2UgdGhlIHdpbmRvdyB3YXMgcHJldmlvdXNseSB1c2VkCisgICAgICAgICAgICAvLyBmb3IgYSB0dW5uZWxlZCB2aWRlbyBwbGF5YmFjay4KKyAgICAgICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X3NpZGViYW5kX3N0cmVhbShuYXRpdmVXaW5kb3cuZ2V0KCksIG51bGxwdHIpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJuYXRpdmVfd2luZG93X3NldF9zaWRlYmFuZF9zdHJlYW0obnVsbHB0cikgZmFpbGVkISAoZXJyICVkKS4iLCBlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIG1DaGFubmVsLT5zZXRTdXJmYWNlKHN1cmZhY2UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCmluZGV4IDMwNzM5NmIuLjBkZTBiNzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKQEAgLTI1NCw3ICsyNTQsNyBAQAogICAgICAgICAgICAgICAgIGJvb2wgcmVsZWFzZWQgPSBpbnB1dC0+YnVmZmVycy0+cmVsZWFzZUJ1ZmZlcihidWZmZXIsIG51bGxwdHIsIHRydWUpOwogICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIHF1ZXVlSW5wdXRCdWZmZXI6IGJ1ZmZlciBjb3BpZWQ7ICVzcmVsZWFzZWQiLAogICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCByZWxlYXNlZCA/ICIiIDogIm5vdCAiKTsKLSAgICAgICAgICAgICAgICBidWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBjb3B5OwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBBTE9HVygiWyVzXSBxdWV1ZUlucHV0QnVmZmVyOiBmYWlsZWQgdG8gY29weSBhIGJ1ZmZlcjsgdGhpcyBtYXkgY2F1c2UgaW5wdXQgIgogICAgICAgICAgICAgICAgICAgICAgICJidWZmZXIgc3RhcnZhdGlvbiBvbiBjb21wb25lbnQuIiwgbU5hbWUpOwpAQCAtMjgyLDYgKzI4MiwxMiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChlb3MpIHsKKyAgICAgICAgTXV0ZXhlZDxJbnB1dD46OkxvY2tlZCBpbnB1dChtSW5wdXQpOworICAgICAgICBpZiAoaW5wdXQtPmZyYW1lUmVhc3NlbWJsZXIpIHsKKyAgICAgICAgICAgIHVzZXNGcmFtZVJlYXNzZW1ibGVyID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIGRyYWluIGFueSBwZW5kaW5nIGl0ZW1zIHdpdGggZW9zCisgICAgICAgICAgICBpbnB1dC0+ZnJhbWVSZWFzc2VtYmxlci5wcm9jZXNzKGJ1ZmZlciwgJml0ZW1zKTsKKyAgICAgICAgfQogICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOwogICAgIH0KICAgICBpZiAodXNlc0ZyYW1lUmVhc3NlbWJsZXIpIHsKQEAgLTM0MSwxMCArMzQ3LDEwIEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgTXV0ZXhlZDxJbnB1dD46OkxvY2tlZCBpbnB1dChtSW5wdXQpOwogICAgICAgICBib29sIHJlbGVhc2VkID0gZmFsc2U7Ci0gICAgICAgIGlmIChidWZmZXIpIHsKLSAgICAgICAgICAgIHJlbGVhc2VkID0gaW5wdXQtPmJ1ZmZlcnMtPnJlbGVhc2VCdWZmZXIoYnVmZmVyLCBudWxscHRyLCB0cnVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChjb3B5KSB7CisgICAgICAgIGlmIChjb3B5KSB7CiAgICAgICAgICAgICByZWxlYXNlZCA9IGlucHV0LT5leHRyYUJ1ZmZlcnMucmVsZWFzZVNsb3QoY29weSwgbnVsbHB0ciwgdHJ1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICByZWxlYXNlZCA9IGlucHV0LT5idWZmZXJzLT5yZWxlYXNlQnVmZmVyKGJ1ZmZlciwgbnVsbHB0ciwgdHJ1ZSk7CiAgICAgICAgIH0KICAgICAgICAgQUxPR1YoIlslc10gcXVldWVJbnB1dEJ1ZmZlcjogYnVmZmVyJXMgJXNyZWxlYXNlZCIsCiAgICAgICAgICAgICAgIG1OYW1lLCAoYnVmZmVyID09IG51bGxwdHIpID8gIihjb3B5KSIgOiAiIiwgcmVsZWFzZWQgPyAiIiA6ICJub3QgIik7CkBAIC0xMzgyLDYgKzEzODgsMTIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IHR1bm5lbGVkID0gMDsKKyAgICAgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiYW5kcm9pZC5fdHVubmVsZWQiLCAmdHVubmVsZWQpKSB7CisgICAgICAgICAgICB0dW5uZWxlZCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgbVR1bm5lbGVkID0gKHR1bm5lbGVkICE9IDApOwogICAgIH0KIAogICAgIC8vIFNldCB1cCBwaXBlbGluZSBjb250cm9sLiBUaGlzIGhhcyB0byBiZSBkb25lIGFmdGVyIG1JbnB1dEJ1ZmZlcnMgYW5kCkBAIC0xNDU1LDYgKzE0NjcsMTYgQEAKICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRDb25maWdzOwogICAgIG1GbHVzaGVkQ29uZmlncy5sb2NrKCktPnN3YXAoZmx1c2hlZENvbmZpZ3MpOwogICAgIGlmICghZmx1c2hlZENvbmZpZ3MuZW1wdHkoKSkgeworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPFBpcGVsaW5lV2F0Y2hlcj46OkxvY2tlZCB3YXRjaGVyKG1QaXBlbGluZVdhdGNoZXIpOworICAgICAgICAgICAgUGlwZWxpbmVXYXRjaGVyOjpDbG9jazo6dGltZV9wb2ludCBub3cgPSBQaXBlbGluZVdhdGNoZXI6OkNsb2NrOjpub3coKTsKKyAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmsgOiBmbHVzaGVkQ29uZmlncykgeworICAgICAgICAgICAgICAgIHdhdGNoZXItPm9uV29ya1F1ZXVlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3Iod29yay0+aW5wdXQuYnVmZmVycyksCisgICAgICAgICAgICAgICAgICAgICAgICBub3cpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXVlKCZmbHVzaGVkQ29uZmlncyk7CiAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKICAgICAgICAgICAgIEFMT0dXKCJbJXNdIEVycm9yIHdoaWxlIHF1ZXVlaW5nIGEgZmx1c2hlZCBjb25maWciLCBtTmFtZSk7CkBAIC0xNTIxLDQxICsxNTQzLDQ1IEBACiAgICAgc2V0RGVzY3JhbWJsZXIobnVsbHB0cik7CiB9CiAKLQogdm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpmbHVzaChjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZmbHVzaGVkV29yaykgewogICAgIEFMT0dWKCJbJXNdIGZsdXNoIiwgbU5hbWUpOwotICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBpbmRpY2VzOwogICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gY29uZmlnczsKICAgICBtSW5wdXQubG9jaygpLT5sYXN0Rmx1c2hJbmRleCA9IG1GcmFtZUluZGV4LmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7Ci0gICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayA6IGZsdXNoZWRXb3JrKSB7Ci0gICAgICAgIGluZGljZXMucHVzaF9iYWNrKHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKLSAgICAgICAgaWYgKCEod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8UGlwZWxpbmVXYXRjaGVyPjo6TG9ja2VkIHdhdGNoZXIobVBpcGVsaW5lV2F0Y2hlcik7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICAgICAgaWYgKCEod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpKSB7CisgICAgICAgICAgICAgICAgd2F0Y2hlci0+b25Xb3JrRG9uZShmcmFtZUluZGV4KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgfHwgd29yay0+aW5wdXQuYnVmZmVycy5mcm9udCgpID09IG51bGxwdHIKKyAgICAgICAgICAgICAgICAgICAgfHwgd29yay0+aW5wdXQuYnVmZmVycy5mcm9udCgpLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIG5vIGxpbmVhciBjb2RlYyBjb25maWcgZGF0YSBmb3VuZCIsIG1OYW1lKTsKKyAgICAgICAgICAgICAgICB3YXRjaGVyLT5vbldvcmtEb25lKGZyYW1lSW5kZXgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gY29weShuZXcgQzJXb3JrKTsKKyAgICAgICAgICAgIGNvcHktPmlucHV0LmZsYWdzID0gQzJGcmFtZURhdGE6OmZsYWdzX3QoCisgICAgICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmZsYWdzIHwgQzJGcmFtZURhdGE6OkZMQUdfRFJPUF9GUkFNRSk7CisgICAgICAgICAgICBjb3B5LT5pbnB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgICAgIGNvcHktPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IG1GcmFtZUluZGV4Kys7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdvcmstPmlucHV0LmJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBjb3B5LT5pbnB1dC5idWZmZXJzLnB1c2hfYmFjayh3YXRjaGVyLT5vbklucHV0QnVmZmVyUmVsZWFzZWQoZnJhbWVJbmRleCwgaSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtIDogd29yay0+aW5wdXQuY29uZmlnVXBkYXRlKSB7CisgICAgICAgICAgICAgICAgY29weS0+aW5wdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KCpwYXJhbSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29weS0+aW5wdXQuaW5mb0J1ZmZlcnMuaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICBjb3B5LT5pbnB1dC5pbmZvQnVmZmVycy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5pbmZvQnVmZmVycy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5pbmZvQnVmZmVycy5lbmQoKSk7CisgICAgICAgICAgICBjb3B5LT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgICAgICAgICBjb25maWdzLnB1c2hfYmFjayhzdGQ6Om1vdmUoY29weSkpOworICAgICAgICAgICAgd2F0Y2hlci0+b25Xb3JrRG9uZShmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIHN0YXNoZWQgZmx1c2hlZCBjb2RlYyBjb25maWcgZGF0YSIsIG1OYW1lKTsKICAgICAgICAgfQotICAgICAgICBpZiAod29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpCi0gICAgICAgICAgICAgICAgfHwgd29yay0+aW5wdXQuYnVmZmVycy5mcm9udCgpID09IG51bGxwdHIKLSAgICAgICAgICAgICAgICB8fCB3b3JrLT5pbnB1dC5idWZmZXJzLmZyb250KCktPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBBTE9HRCgiWyVzXSBubyBsaW5lYXIgY29kZWMgY29uZmlnIGRhdGEgZm91bmQiLCBtTmFtZSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiBjb3B5KG5ldyBDMldvcmspOwotICAgICAgICBjb3B5LT5pbnB1dC5mbGFncyA9IEMyRnJhbWVEYXRhOjpmbGFnc190KHdvcmstPmlucHV0LmZsYWdzIHwgQzJGcmFtZURhdGE6OkZMQUdfRFJPUF9GUkFNRSk7Ci0gICAgICAgIGNvcHktPmlucHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOwotICAgICAgICBjb3B5LT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBtRnJhbWVJbmRleCsrOwotICAgICAgICBjb3B5LT5pbnB1dC5idWZmZXJzLmluc2VydCgKLSAgICAgICAgICAgICAgICBjb3B5LT5pbnB1dC5idWZmZXJzLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5iZWdpbigpLAotICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW5kKCkpOwotICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiAmcGFyYW0gOiB3b3JrLT5pbnB1dC5jb25maWdVcGRhdGUpIHsKLSAgICAgICAgICAgIGNvcHktPmlucHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weSgqcGFyYW0pKTsKLSAgICAgICAgfQotICAgICAgICBjb3B5LT5pbnB1dC5pbmZvQnVmZmVycy5pbnNlcnQoCi0gICAgICAgICAgICAgICAgY29weS0+aW5wdXQuaW5mb0J1ZmZlcnMuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5pbmZvQnVmZmVycy5iZWdpbigpLAotICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmluZm9CdWZmZXJzLmVuZCgpKTsKLSAgICAgICAgY29weS0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOwotICAgICAgICBjb25maWdzLnB1c2hfYmFjayhzdGQ6Om1vdmUoY29weSkpOwotICAgICAgICBBTE9HVigiWyVzXSBzdGFzaGVkIGZsdXNoZWQgY29kZWMgY29uZmlnIGRhdGEiLCBtTmFtZSk7CiAgICAgfQogICAgIG1GbHVzaGVkQ29uZmlncy5sb2NrKCktPnN3YXAoY29uZmlncyk7CiAgICAgewpAQCAtMTU3MCwxMiArMTU5Niw2IEBACiAgICAgICAgICAgICBvdXRwdXQtPmJ1ZmZlcnMtPmZsdXNoU3Rhc2goKTsKICAgICAgICAgfQogICAgIH0KLSAgICB7Ci0gICAgICAgIE11dGV4ZWQ8UGlwZWxpbmVXYXRjaGVyPjo6TG9ja2VkIHdhdGNoZXIobVBpcGVsaW5lV2F0Y2hlcik7Ci0gICAgICAgIGZvciAodWludDY0X3QgaW5kZXggOiBpbmRpY2VzKSB7Ci0gICAgICAgICAgICB3YXRjaGVyLT5vbldvcmtEb25lKGluZGV4KTsKLSAgICAgICAgfQotICAgIH0KIH0KIAogdm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpvbldvcmtEb25lKApAQCAtMTg5MSwxMCArMTkxMSwyMSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgYm9vbCBkcm9wID0gZmFsc2U7CisgICAgaWYgKHdvcmtsZXQtPm91dHB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0RST1BfRlJBTUUpIHsKKyAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogZHJvcCBidWZmZXIgYnV0IGtlZXAgbWV0YWRhdGEiLCBtTmFtZSk7CisgICAgICAgIGRyb3AgPSB0cnVlOworICAgIH0KKwogICAgIGlmIChub3RpZnlDbGllbnQgJiYgIWJ1ZmZlciAmJiAhZmxhZ3MpIHsKLSAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogTm90IHJlcG9ydGluZyBvdXRwdXQgYnVmZmVyICglbGxkKSIsCi0gICAgICAgICAgICAgIG1OYW1lLCB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3VsbCgpKTsKLSAgICAgICAgbm90aWZ5Q2xpZW50ID0gZmFsc2U7CisgICAgICAgIGlmIChtVHVubmVsZWQgJiYgZHJvcCAmJiBvdXRwdXRGb3JtYXQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IEtlZXAgdHVubmVsZWQsIGRyb3AgZnJhbWUgd2l0aCBmb3JtYXQgY2hhbmdlICglbGxkKSIsCisgICAgICAgICAgICAgICAgICBtTmFtZSwgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1bGwoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBOb3QgcmVwb3J0aW5nIG91dHB1dCBidWZmZXIgKCVsbGQpIiwKKyAgICAgICAgICAgICAgICAgIG1OYW1lLCB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3VsbCgpKTsKKyAgICAgICAgICAgIG5vdGlmeUNsaWVudCA9IGZhbHNlOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGJ1ZmZlcikgewpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmgKaW5kZXggNGRiNjljYi4uMjZlZWYzMCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuaAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5oCkBAIC0zMjQsNiArMzI0LDggQEAKICAgICAgICAgcmV0dXJuIG1DcnlwdG8gIT0gbnVsbHB0ciB8fCBtRGVzY3JhbWJsZXIgIT0gbnVsbHB0cjsKICAgICB9CiAgICAgc3RkOjphdG9taWNfYm9vbCBtU2VuZEVuY3J5cHRlZEluZm9CdWZmZXI7CisKKyAgICBzdGQ6OmF0b21pY19ib29sIG1UdW5uZWxlZDsKIH07CiAKIC8vIENvbnZlcnNpb24gb2YgYSBjMl9zdGF0dXNfdCB2YWx1ZSB0byBhIHN0YXR1c190IHZhbHVlIG1heSBkZXBlbmQgb24gdGhlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5jcHAKaW5kZXggMzMzYTJjYS4uOTdlMWEwMSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmNwcApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmg+CkBAIC0xMzIsNiArMTMzLDcgQEAKICAgICBpZiAoIWNvcHktPmNvcHkoYzJidWZmZXIpKSB7CiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KKyAgICBjb3B5LT5tZXRhKCktPmV4dGVuZChidWZmZXItPm1ldGEoKSk7CiAgICAgcmV0dXJuIGNvcHk7CiB9CiAKQEAgLTE5OSw2ICsyMDEsNTYgQEAKICAgICBtU2tpcEN1dEJ1ZmZlciA9IG5ldyBTa2lwQ3V0QnVmZmVyKHNraXAsIGN1dCwgbUNoYW5uZWxDb3VudCk7CiB9CiAKK2Jvb2wgT3V0cHV0QnVmZmVyczo6Y29udmVydCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmc3JjLCBzcDxDb2RlYzJCdWZmZXI+ICpkc3QpIHsKKyAgICBpZiAoIXNyYyB8fCBzcmMtPmRhdGEoKS50eXBlKCkgIT0gQzJCdWZmZXJEYXRhOjpMSU5FQVIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpbnQzMl90IGNvbmZpZ0VuY29kaW5nID0ga0F1ZGlvRW5jb2RpbmdQY20xNmJpdDsKKyAgICBpbnQzMl90IGNvZGVjRW5jb2RpbmcgPSBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0OworICAgIGlmIChtRm9ybWF0LT5maW5kSW50MzIoImFuZHJvaWQuX2NvZGVjLXBjbS1lbmNvZGluZyIsICZjb2RlY0VuY29kaW5nKQorICAgICAgICAgICAgJiYgbUZvcm1hdC0+ZmluZEludDMyKCJhbmRyb2lkLl9jb25maWctcGNtLWVuY29kaW5nIiwgJmNvbmZpZ0VuY29kaW5nKSkgeworICAgICAgICBpZiAobVNyY0VuY29kaW5nICE9IGNvZGVjRW5jb2RpbmcgfHwgbURzdEVuY29kaW5nICE9IGNvbmZpZ0VuY29kaW5nKSB7CisgICAgICAgICAgICBpZiAoY29kZWNFbmNvZGluZyAhPSBjb25maWdFbmNvZGluZykgeworICAgICAgICAgICAgICAgIG1EYXRhQ29udmVydGVyID0gQXVkaW9Db252ZXJ0ZXI6OkNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIChBdWRpb0VuY29kaW5nKWNvZGVjRW5jb2RpbmcsIChBdWRpb0VuY29kaW5nKWNvbmZpZ0VuY29kaW5nKTsKKyAgICAgICAgICAgICAgICBBTE9HRF9JRihtRGF0YUNvbnZlcnRlciwgIlslc10gQ29udmVydGVyIGNyZWF0ZWQgZnJvbSAlZCB0byAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIGNvZGVjRW5jb2RpbmcsIGNvbmZpZ0VuY29kaW5nKTsKKyAgICAgICAgICAgICAgICBtRm9ybWF0V2l0aENvbnZlcnRlciA9IG1Gb3JtYXQtPmR1cCgpOworICAgICAgICAgICAgICAgIG1Gb3JtYXRXaXRoQ29udmVydGVyLT5zZXRJbnQzMihLRVlfUENNX0VOQ09ESU5HLCBjb25maWdFbmNvZGluZyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1EYXRhQ29udmVydGVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBtRm9ybWF0V2l0aENvbnZlcnRlciA9IG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3JjRW5jb2RpbmcgPSBjb2RlY0VuY29kaW5nOworICAgICAgICAgICAgbURzdEVuY29kaW5nID0gY29uZmlnRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGludCBlbmNvZGluZzsgIW1Gb3JtYXQtPmZpbmRJbnQzMihLRVlfUENNX0VOQ09ESU5HLCAmZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgfHwgZW5jb2RpbmcgIT0gbURzdEVuY29kaW5nKSB7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFtRGF0YUNvbnZlcnRlcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IHNyY0J1ZmZlciA9IENvbnN0TGluZWFyQmxvY2tCdWZmZXI6OkFsbG9jYXRlKG1Gb3JtYXQsIHNyYyk7CisgICAgaWYgKCFzcmNCdWZmZXIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoISpkc3QpIHsKKyAgICAgICAgKmRzdCA9IG5ldyBDb2RlYzJCdWZmZXIoCisgICAgICAgICAgICAgICAgbUZvcm1hdCwKKyAgICAgICAgICAgICAgICBuZXcgQUJ1ZmZlcihtRGF0YUNvbnZlcnRlci0+dGFyZ2V0U2l6ZShzcmNCdWZmZXItPnNpemUoKSkpKTsKKyAgICB9CisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gZHN0QnVmZmVyID0gKmRzdDsKKyAgICBzdGF0dXNfdCBlcnIgPSBtRGF0YUNvbnZlcnRlci0+Y29udmVydChzcmNCdWZmZXIsIGRzdEJ1ZmZlcik7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRCgiWyVzXSBidWZmZXIgY29udmVyc2lvbiBmYWlsZWQ6ICVkIiwgbU5hbWUsIGVycik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZHN0QnVmZmVyLT5zZXRGb3JtYXQobUZvcm1hdFdpdGhDb252ZXJ0ZXIpOworICAgIHJldHVybiB0cnVlOworfQorCiB2b2lkIE91dHB1dEJ1ZmZlcnM6OmNsZWFyU3Rhc2goKSB7CiAgICAgbVBlbmRpbmcuY2xlYXIoKTsKICAgICBtUmVvcmRlclN0YXNoLmNsZWFyKCk7CkBAIC0xMDc4LDcgKzExMzAsNyBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KICAgICBjMkJ1ZmZlci0+c2V0Rm9ybWF0KG1Gb3JtYXQpOwotICAgIGlmICghYzJCdWZmZXItPmNvcHkoYnVmZmVyKSkgeworICAgIGlmICghY29udmVydChidWZmZXIsICZjMkJ1ZmZlcikgJiYgIWMyQnVmZmVyLT5jb3B5KGJ1ZmZlcikpIHsKICAgICAgICAgQUxPR0QoIlslc10gY29weSBidWZmZXIgZmFpbGVkIiwgbU5hbWUpOwogICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CiAgICAgfQpAQCAtMTE5NCw5ICsxMjQ2LDEyIEBACiAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKICAgICAgICAgc2l6ZV90ICppbmRleCwKICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmNsaWVudEJ1ZmZlcikgewotICAgIHNwPENvZGVjMkJ1ZmZlcj4gbmV3QnVmZmVyID0gd3JhcChidWZmZXIpOwotICAgIGlmIChuZXdCdWZmZXIgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIHNwPENvZGVjMkJ1ZmZlcj4gbmV3QnVmZmVyOworICAgIGlmICghY29udmVydChidWZmZXIsICZuZXdCdWZmZXIpKSB7CisgICAgICAgIG5ld0J1ZmZlciA9IHdyYXAoYnVmZmVyKTsKKyAgICAgICAgaWYgKG5ld0J1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CiAgICAgfQogICAgIG5ld0J1ZmZlci0+c2V0Rm9ybWF0KG1Gb3JtYXQpOwogICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5oCmluZGV4IDk5NWQzYTQuLmM4ZTk5MzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmgKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuaApAQCAtMTgsOSArMTgsMTEgQEAKIAogI2RlZmluZSBDQ09ERUNfQlVGRkVSU19IXwogCisjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8c3RyaW5nPgogCiAjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxEYXRhQ29udmVydGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KIApAQCAtMzgyLDYgKzM4NCwxNCBAQAogICAgICAqLwogICAgIHZvaWQgc3VibWl0KGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpOwogCisgICAgLyoqCisgICAgICogQXBwbHkgRGF0YUNvbnZlcnRlciBmcm9tIHxzcmN8IHRvIHwqZHN0fCBpZiBuZWVkZWQuIElmIHwqZHN0fCBpcyBudWxscHRyLAorICAgICAqIGEgbmV3IGJ1ZmZlciBpcyBhbGxvY2F0ZWQuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgY29udmVyc2lvbiB3YXMgbmVlZGVkIGFuZCBleGVjdXRlZDsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2wgY29udmVydChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZzcmMsIHNwPENvZGVjMkJ1ZmZlcj4gKmRzdCk7CisKIHByaXZhdGU6CiAgICAgLy8gU2tpcEN1dEJ1ZmZlcgogICAgIGludDMyX3QgbURlbGF5OwpAQCAtMzkxLDYgKzQwMSwxMiBAQAogCiAgICAgdm9pZCBzZXRTa2lwQ3V0QnVmZmVyKGludDMyX3Qgc2tpcCwgaW50MzJfdCBjdXQpOwogCisgICAgLy8gRGF0YUNvbnZlcnRlcgorICAgIHNwPERhdGFDb252ZXJ0ZXI+IG1EYXRhQ29udmVydGVyOworICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0V2l0aENvbnZlcnRlcjsKKyAgICBzdGQ6Om9wdGlvbmFsPGludDMyX3Q+IG1TcmNFbmNvZGluZzsKKyAgICBzdGQ6Om9wdGlvbmFsPGludDMyX3Q+IG1Ec3RFbmNvZGluZzsKKwogICAgIC8vIE91dHB1dCBzdGFzaAogCiAgICAgLy8gU3RydWN0IGZvciBhbiBlbnRyeSBpbiB0aGUgb3V0cHV0IHN0YXNoIChtUGVuZGluZyBhbmQgbVJlb3JkZXJTdGFzaCkKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5jcHAKaW5kZXggYzI3NTE4Ny4uMDM0MThkOSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5jcHAKQEAgLTY1NywyNCArNjU3LDI5IEBACiAgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfU0FNUExFX1JBVEUsICAgQzJfUEFSQU1LRVlfQ09ERURfU0FNUExFX1JBVEUsICAidmFsdWUiKQogICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkNPREVEKSk7CiAKLSAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9QQ01fRU5DT0RJTkcsICBDMl9QQVJBTUtFWV9QQ01fRU5DT0RJTkcsICAgICAgICJ2YWx1ZSIpCisgICAgYXV0byBwY21FbmNvZGluZ01hcHBlciA9IFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgIEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCB0bzsKKyAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkgJiYgQzJNYXBwZXI6Om1hcCh2YWx1ZSwgJnRvKSkgeworICAgICAgICAgICAgcmV0dXJuIHRvOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgfTsKKyAgICBhdXRvIHBjbUVuY29kaW5nUmV2ZXJzZSA9IFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgIEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCB2YWx1ZTsKKyAgICAgICAgaW50MzJfdCB0bzsKKyAgICAgICAgdXNpbmcgQzJWYWx1ZVR5cGU9dHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTxkZWNsdHlwZSh2YWx1ZSk+Ojp0eXBlOworICAgICAgICBpZiAodi5nZXQoKEMyVmFsdWVUeXBlKikmdmFsdWUpICYmIEMyTWFwcGVyOjptYXAodmFsdWUsICZ0bykpIHsKKyAgICAgICAgICAgIHJldHVybiB0bzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgIH07CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUENNX0VOQ09ESU5HLCAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfUENNX0VOQ09ESU5HLCAidmFsdWUiKQogICAgICAgICAubGltaXRUbyhEOjpBVURJTykKLSAgICAgICAgLndpdGhNYXBwZXJzKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7Ci0gICAgICAgICAgICBpbnQzMl90IHZhbHVlOwotICAgICAgICAgICAgQzJDb25maWc6OnBjbV9lbmNvZGluZ190IHRvOwotICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkgJiYgQzJNYXBwZXI6Om1hcCh2YWx1ZSwgJnRvKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0bzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7Ci0gICAgICAgIH0sIFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7Ci0gICAgICAgICAgICBDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QgdmFsdWU7Ci0gICAgICAgICAgICBpbnQzMl90IHRvOwotICAgICAgICAgICAgdXNpbmcgQzJWYWx1ZVR5cGU9dHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTxkZWNsdHlwZSh2YWx1ZSk+Ojp0eXBlOwotICAgICAgICAgICAgaWYgKHYuZ2V0KChDMlZhbHVlVHlwZSopJnZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKHZhbHVlLCAmdG8pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRvOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKLSAgICAgICAgfSkpOworICAgICAgICAud2l0aE1hcHBlcnMocGNtRW5jb2RpbmdNYXBwZXIsIHBjbUVuY29kaW5nUmV2ZXJzZSkpOworICAgIGFkZChDb25maWdNYXBwZXIoImFuZHJvaWQuX2NvZGVjLXBjbS1lbmNvZGluZyIsIEMyX1BBUkFNS0VZX1BDTV9FTkNPRElORywgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpSRUFEKQorICAgICAgICAud2l0aE1hcHBlcnMocGNtRW5jb2RpbmdNYXBwZXIsIHBjbUVuY29kaW5nUmV2ZXJzZSkpOwogCiAgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfSVNfQURUUywgQzJfUEFSQU1LRVlfQUFDX1BBQ0tBR0lORywgInZhbHVlIikKICAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpDT0RFRCkKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMySW5mb0J1aWxkZXIuY3BwCmluZGV4IDdjNGJmYjYuLjY3ZDdlZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmNwcApAQCAtOTYsOSArOTYsMTIgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIC8vIGRldGVybWluZSBpZiBjb2RlYyBzdXBwb3J0cyBIRFIKKyAgICAvLyBkZXRlcm1pbmUgaWYgY29kZWMgc3VwcG9ydHMgSERSOyBpbXBseSAxMC1iaXQgc3VwcG9ydAogICAgIGJvb2wgc3VwcG9ydHNIZHIgPSBmYWxzZTsKKyAgICAvLyBkZXRlcm1pbmUgaWYgY29kZWMgc3VwcG9ydHMgSERSMTBQbHVzOyBpbXBseSAxMC1iaXQgc3VwcG9ydAogICAgIGJvb2wgc3VwcG9ydHNIZHIxMFBsdXMgPSBmYWxzZTsKKyAgICAvLyBkZXRlcm1pbmUgaWYgY29kZWMgc3VwcG9ydHMgMTAtYml0IGZvcm1hdAorICAgIGJvb2wgc3VwcG9ydHMxMEJpdCA9IGZhbHNlOwogCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gcGFyYW1EZXNjczsKICAgICBjMl9zdGF0dXNfdCBlcnIxID0gaW50Zi0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMoJnBhcmFtRGVzY3MpOwpAQCAtMTI2LDYgKzEyOSwxMCBAQAogICAgIHN1cHBvcnRzSGRyIHw9IChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fVlA5KTsKICAgICBzdXBwb3J0c0hkciB8PSAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX0FWMSk7CiAKKyAgICAvLyBIRFIgc3VwcG9ydCBpbXBsaWVzIDEwLWJpdCBzdXBwb3J0LgorICAgIC8vIFRPRE86IGRpcmVjdGx5IGNoZWNrIHRoaXMgZnJvbSB0aGUgY29tcG9uZW50IGludGVyZmFjZQorICAgIHN1cHBvcnRzMTBCaXQgPSAoc3VwcG9ydHNIZHIgfHwgc3VwcG9ydHNIZHIxMFBsdXMpOworCiAgICAgYm9vbCBhZGRlZCA9IGZhbHNlOwogCiAgICAgZm9yIChDMlZhbHVlOjpQcmltaXRpdmUgcHJvZmlsZSA6IHByb2ZpbGVRdWVyeVswXS52YWx1ZXMudmFsdWVzKSB7CkBAIC0xNjUsNiArMTcyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3VwcG9ydHMxMEJpdCkgeworICAgICAgICAgICAgICAgIGF1dG8gYml0bmVzc01hcHBlciA9IEMyTWFwcGVyOjpHZXRCaXREZXB0aFByb2ZpbGVMZXZlbE1hcHBlcih0cmFpdC5tZWRpYVR5cGUsIDEwKTsKKyAgICAgICAgICAgICAgICBpZiAoYml0bmVzc01hcHBlciAmJiBiaXRuZXNzTWFwcGVyLT5tYXBQcm9maWxlKHBsLnByb2ZpbGUsICZzZGtQcm9maWxlKSkgeworICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoKHVpbnQzMl90KXNka1Byb2ZpbGUsICh1aW50MzJfdClzZGtMZXZlbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKCFtYXBwZXIpIHsKICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChwbC5wcm9maWxlLCBwbC5sZXZlbCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9GcmFtZVJlYXNzZW1ibGVyLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9GcmFtZVJlYXNzZW1ibGVyLmNwcAppbmRleCBhZjA1NGM3Li5jYjhiNmFiIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vRnJhbWVSZWFzc2VtYmxlci5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0ZyYW1lUmVhc3NlbWJsZXIuY3BwCkBAIC04OCw4ICs4OCw3IEBACiAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCiAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gKml0ZW1zKSB7CiAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgaWYgKGJ1ZmZlci0+c2l6ZSgpID09IDB1Ci0gICAgICAgICAgICB8fCAhYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpIHsKKyAgICBpZiAoIWJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKSB7CiAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQ0NvZGVjQ29uZmlnX3Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0NDb2RlY0NvbmZpZ190ZXN0LmNwcAppbmRleCA3YzY2MGRjLi4zNjE1Mjg5IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQ0NvZGVjQ29uZmlnX3Rlc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9DQ29kZWNDb25maWdfdGVzdC5jcHAKQEAgLTIyNCw2ICsyMjQsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29weTxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQsIEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0Qml0cmF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRQcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBQUk9GSUxFX1VOVVNFRCwgTEVWRUxfVU5VU0VEKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtT3V0cHV0UHJvZmlsZUxldmVsLCBwcm9maWxlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1PdXRwdXRQcm9maWxlTGV2ZWwsIGxldmVsKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIFRPRE86IG1vcmUgU0RLIHBhcmFtcwpAQCAtMjQxLDYgKzI1Miw4IEBACiAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEFzcGVjdFJhdGlvSW5mbzo6b3V0cHV0PiBtUGl4ZWxBc3BlY3RSYXRpbzsKICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dD4gbUlucHV0Qml0cmF0ZTsKICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1PdXRwdXRCaXRyYXRlOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1JbnB1dFByb2ZpbGVMZXZlbDsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gbU91dHB1dFByb2ZpbGVMZXZlbDsKIAogICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgICAgICAgICAgIHN0YXRpYyBDMlIgU2V0dGVyKGJvb2wsIEMyUDxUPiAmKSB7CkBAIC01NzYsNCArNTg5LDUxIEBACiAgICAgICAgICAgICA8PCAibU91dHB1dEZvcm1hdCA9ICIgPDwgbUNvbmZpZy5tT3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCk7CiB9CiAKK3R5cGVkZWYgc3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgQzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gSGRyUHJvZmlsZXNQYXJhbXM7CisKK2NsYXNzIEhkclByb2ZpbGVzVGVzdAorICAgIDogcHVibGljIENDb2RlY0NvbmZpZ1Rlc3QsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8SGRyUHJvZmlsZXNQYXJhbXM+IHsKK307CisKK1RFU1RfUChIZHJQcm9maWxlc1Rlc3QsIFNldEZyb21TZGspIHsKKyAgICBIZHJQcm9maWxlc1BhcmFtcyBwYXJhbXMgPSBHZXRQYXJhbSgpOworICAgIHN0ZDo6c3RyaW5nIG1lZGlhVHlwZSA9IHN0ZDo6Z2V0PDA+KHBhcmFtcyk7CisgICAgQzJDb25maWc6OnByb2ZpbGVfdCBjMlByb2ZpbGUgPSBzdGQ6OmdldDwxPihwYXJhbXMpOworICAgIGludDMyX3Qgc2RrUHJvZmlsZSA9IHN0ZDo6Z2V0PDI+KHBhcmFtcyk7CisKKyAgICBpbml0KEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sIEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIsIG1lZGlhVHlwZS5jX3N0cigpKTsKKworICAgIEFTU0VSVF9FUShPSywgbUNvbmZpZy5pbml0aWFsaXplKG1SZWZsZWN0b3IsIG1Db25maWd1cmFibGUpKTsKKworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXR7bmV3IEFNZXNzYWdlfTsKKyAgICBmb3JtYXQtPnNldEludDMyKEtFWV9QUk9GSUxFLCBzZGtQcm9maWxlKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gY29uZmlnVXBkYXRlOworICAgIEFTU0VSVF9FUShPSywgbUNvbmZpZy5nZXRDb25maWdVcGRhdGVGcm9tU2RrUGFyYW1zKAorICAgICAgICAgICAgbUNvbmZpZ3VyYWJsZSwgZm9ybWF0LCBEOjpBTEwsIEMyX01BWV9CTE9DSywgJmNvbmZpZ1VwZGF0ZSkpOworCisgICAgQVNTRVJUX0VRKDF1LCBjb25maWdVcGRhdGUuc2l6ZSgpKTsKKyAgICBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0ICpwbCA9CisgICAgICAgIEZpbmRQYXJhbTxzdGQ6OnJlbW92ZV9wb2ludGVyPGRlY2x0eXBlKHBsKT46OnR5cGU+KGNvbmZpZ1VwZGF0ZSk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIHBsKTsKKyAgICBBU1NFUlRfRVEoYzJQcm9maWxlLCBwbC0+cHJvZmlsZSk7Cit9CisKK0hkclByb2ZpbGVzUGFyYW1zIGtIZHJQcm9maWxlc1BhcmFtc1tdID0geworICAgIHN0ZDo6bWFrZV90dXBsZShNSU1FVFlQRV9WSURFT19IRVZDLCBQUk9GSUxFX0hFVkNfTUFJTl8xMCwgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMCksCisgICAgc3RkOjptYWtlX3R1cGxlKE1JTUVUWVBFX1ZJREVPX0hFVkMsIFBST0ZJTEVfSEVWQ19NQUlOXzEwLCBIRVZDUHJvZmlsZU1haW4xMEhEUjEwUGx1cyksCisgICAgc3RkOjptYWtlX3R1cGxlKE1JTUVUWVBFX1ZJREVPX1ZQOSwgIFBST0ZJTEVfVlA5XzIsICAgICAgICBWUDlQcm9maWxlMkhEUiksCisgICAgc3RkOjptYWtlX3R1cGxlKE1JTUVUWVBFX1ZJREVPX1ZQOSwgIFBST0ZJTEVfVlA5XzIsICAgICAgICBWUDlQcm9maWxlMkhEUjEwUGx1cyksCisgICAgc3RkOjptYWtlX3R1cGxlKE1JTUVUWVBFX1ZJREVPX1ZQOSwgIFBST0ZJTEVfVlA5XzMsICAgICAgICBWUDlQcm9maWxlM0hEUiksCisgICAgc3RkOjptYWtlX3R1cGxlKE1JTUVUWVBFX1ZJREVPX1ZQOSwgIFBST0ZJTEVfVlA5XzMsICAgICAgICBWUDlQcm9maWxlM0hEUjEwUGx1cyksCisgICAgc3RkOjptYWtlX3R1cGxlKE1JTUVUWVBFX1ZJREVPX0FWMSwgIFBST0ZJTEVfQVYxXzAsICAgICAgICBBVjFQcm9maWxlTWFpbjEwSERSMTApLAorICAgIHN0ZDo6bWFrZV90dXBsZShNSU1FVFlQRV9WSURFT19BVjEsICBQUk9GSUxFX0FWMV8wLCAgICAgICAgQVYxUHJvZmlsZU1haW4xMEhEUjEwUGx1cyksCit9OworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIENDb2RlY0NvbmZpZywKKyAgICAgICAgSGRyUHJvZmlsZXNUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKGtIZHJQcm9maWxlc1BhcmFtcykpOworCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvRnJhbWVSZWFzc2VtYmxlcl90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9GcmFtZVJlYXNzZW1ibGVyX3Rlc3QuY3BwCmluZGV4IDY3MzhlZTcuLjBiZTkzNGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9GcmFtZVJlYXNzZW1ibGVyX3Rlc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9GcmFtZVJlYXNzZW1ibGVyX3Rlc3QuY3BwCkBAIC01Myw3ICs1Myw4IEBACiAgICAgICAgICAgICBDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QgZW5jb2RpbmcsCiAgICAgICAgICAgICBzaXplX3QgaW5wdXRGcmFtZVNpemVJbkJ5dGVzLAogICAgICAgICAgICAgc2l6ZV90IGNvdW50LAotICAgICAgICAgICAgc2l6ZV90IGV4cGVjdGVkT3V0cHV0U2l6ZSkgeworICAgICAgICAgICAgc2l6ZV90IGV4cGVjdGVkT3V0cHV0U2l6ZSwKKyAgICAgICAgICAgIGJvb2wgc2VwYXJhdGVFb3MpIHsKICAgICAgICAgRnJhbWVSZWFzc2VtYmxlciBmcmFtZVJlYXNzZW1ibGVyOwogICAgICAgICBmcmFtZVJlYXNzZW1ibGVyLmluaXQoCiAgICAgICAgICAgICAgICAgbVBvb2wsCkBAIC02Nyw3ICs2OCw3IEBACiAKICAgICAgICAgc2l6ZV90IGlucHV0SW5kZXggPSAwLCBvdXRwdXRJbmRleCA9IDA7CiAgICAgICAgIHNpemVfdCBleHBlY3RDb3VudCA9IDA7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50ICsgKHNlcGFyYXRlRW9zID8gMSA6IDApOyArK2kpIHsKICAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZmZlciA9IG5ldyBNZWRpYUNvZGVjQnVmZmVyKAogICAgICAgICAgICAgICAgICAgICBuZXcgQU1lc3NhZ2UsIG5ldyBBQnVmZmVyKGlucHV0RnJhbWVTaXplSW5CeXRlcykpOwogICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCBpbnB1dEZyYW1lU2l6ZUluQnl0ZXMpOwpAQCAtNzcsOCArNzgsMTIgQEAKICAgICAgICAgICAgIGlmIChpID09IGNvdW50IC0gMSkgewogICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZW9zIiwgMSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGlucHV0RnJhbWVTaXplSW5CeXRlczsgKytqLCArK2lucHV0SW5kZXgpIHsKLSAgICAgICAgICAgICAgICBidWZmZXItPmJhc2UoKVtqXSA9IChpbnB1dEluZGV4ICYgMHhGRik7CisgICAgICAgICAgICBpZiAoaSA9PSBjb3VudCAmJiBzZXBhcmF0ZUVvcykgeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaW5wdXRGcmFtZVNpemVJbkJ5dGVzOyArK2osICsraW5wdXRJbmRleCkgeworICAgICAgICAgICAgICAgICAgICBidWZmZXItPmJhc2UoKVtqXSA9IChpbnB1dEluZGV4ICYgMHhGRik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKICAgICAgICAgICAgIEFTU0VSVF9FUShDMl9PSywgZnJhbWVSZWFzc2VtYmxlci5wcm9jZXNzKGJ1ZmZlciwgJml0ZW1zKSk7CkBAIC0xMDUsNyArMTEwLDggQEAKICAgICAgICAgICAgICAgICBBU1NFUlRfRVEoZW5jb2RlckZyYW1lU2l6ZSAqIEJ5dGVzUGVyU2FtcGxlKGVuY29kaW5nKSwgdmlldy5jYXBhY2l0eSgpKTsKICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHZpZXcuY2FwYWNpdHkoKTsgKytqLCArK291dHB1dEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKG91dHB1dEluZGV4IDwgaW5wdXRJbmRleAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpbnB1dEluZGV4ID09IGlucHV0RnJhbWVTaXplSW5CeXRlcyAqIGNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaW5wdXRJbmRleCA9PSBpbnB1dEZyYW1lU2l6ZUluQnl0ZXMgKiBjb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJpbnB1dEluZGV4ID0gIiA8PCBpbnB1dEluZGV4IDw8ICIgb3V0cHV0SW5kZXggPSAiIDw8IG91dHB1dEluZGV4OwogICAgICAgICAgICAgICAgICAgICB1aW50OF90IGV4cGVjdGVkID0gb3V0cHV0SW5kZXggPCBpbnB1dEluZGV4ID8gKG91dHB1dEluZGV4ICYgMHhGRikgOiAwOwogICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0Q291bnQgPCAxMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgKytleHBlY3RDb3VudDsKQEAgLTEzNywyMDQgKzE0MywyMzkgQEAKIC8vIFB1c2ggZnJhbWVzIHdpdGggZXhhY3RseSB0aGUgc2FtZSBzaXplIGFzIHRoZSBlbmNvZGVyIHJlcXVlc3RlZC4KIFRFU1RfRihGcmFtZVJlYXNzZW1ibGVyVGVzdCwgUHVzaEV4YWN0RnJhbWVTaXplKSB7CiAgICAgQVNTRVJUX0VRKE9LLCBpbml0U3RhdHVzKCkpOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzgsCi0gICAgICAgICAgICAxMDI0IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDI0IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAxIGJ5dGVzL3NhbXBsZSAqLywKLSAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAotICAgICAgICAgICAgMTAyNDAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMCAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8pOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzE2LAotICAgICAgICAgICAgMjA0OCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAyNCBzYW1wbGVzICogMSBjaGFubmVsICogMiBieXRlcy9zYW1wbGUgKi8sCi0gICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDIwNDgwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTAgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovKTsKLSAgICB0ZXN0UHVzaFNhbWVTaXplKAotICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCi0gICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKLSAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKLSAgICAgICAgICAgIFBDTV9GTE9BVCwKLSAgICAgICAgICAgIDQwOTYgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMjQgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDQgYnl0ZXMvc2FtcGxlICovLAotICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCi0gICAgICAgICAgICA0MDk2MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDEwICogNDA5NiBieXRlcy9mcmFtZSAqLyk7CisgICAgZm9yIChib29sIHNlcGFyYXRlRW9zIDoge2ZhbHNlLCB0cnVlfSkgeworICAgICAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgICAgICBQQ01fOCwKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDI0IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAxIGJ5dGVzL3NhbXBsZSAqLywKKyAgICAgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgICAgICAxMDI0MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDEwICogMTAyNCBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV8xNiwKKyAgICAgICAgICAgICAgICAyMDQ4IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDI0IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAyIGJ5dGVzL3NhbXBsZSAqLywKKyAgICAgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgICAgICAyMDQ4MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDEwICogMjA0OCBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV9GTE9BVCwKKyAgICAgICAgICAgICAgICA0MDk2IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDI0IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiA0IGJ5dGVzL3NhbXBsZSAqLywKKyAgICAgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgICAgICA0MDk2MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDEwICogNDA5NiBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgfQogfQogCiAvLyBQdXNoIGZyYW1lcyB3aXRoIGhhbGYgdGhlIHNpemUgdGhhdCB0aGUgZW5jb2RlciByZXF1ZXN0ZWQuCiBURVNUX0YoRnJhbWVSZWFzc2VtYmxlclRlc3QsIFB1c2hIYWxmRnJhbWVTaXplKSB7CiAgICAgQVNTRVJUX0VRKE9LLCBpbml0U3RhdHVzKCkpOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzgsCi0gICAgICAgICAgICA1MTIgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDUxMiBzYW1wbGVzICogMSBjaGFubmVsICogMSBieXRlcyBwZXIgc2FtcGxlICovLAotICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCi0gICAgICAgICAgICA1MTIwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNSAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8pOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzE2LAotICAgICAgICAgICAgMTAyNCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gNTEyIHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAyIGJ5dGVzIHBlciBzYW1wbGUgKi8sCi0gICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDEwMjQwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNSAqIDIwNDggYnl0ZXMvZnJhbWUgKi8pOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNX0ZMT0FULAotICAgICAgICAgICAgMjA0OCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gNTEyIHNhbXBsZXMgKiAxIGNoYW5uZWwgKiA0IGJ5dGVzIHBlciBzYW1wbGUgKi8sCi0gICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDIwNDgwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNSAqIDQwOTYgYnl0ZXMvZnJhbWUgKi8pOworICAgIGZvciAoYm9vbCBzZXBhcmF0ZUVvcyA6IHtmYWxzZSwgdHJ1ZX0pIHsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNXzgsCisgICAgICAgICAgICAgICAgNTEyIC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSA1MTIgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDEgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDUxMjAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSA1ICogMTAyNCBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV8xNiwKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSA1MTIgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDIgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDEwMjQwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNSAqIDIwNDggYnl0ZXMvZnJhbWUgKi8sCisgICAgICAgICAgICAgICAgc2VwYXJhdGVFb3MpOworICAgICAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgICAgICBQQ01fRkxPQVQsCisgICAgICAgICAgICAgICAgMjA0OCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gNTEyIHNhbXBsZXMgKiAxIGNoYW5uZWwgKiA0IGJ5dGVzL3NhbXBsZSAqLywKKyAgICAgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgICAgICAyMDQ4MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDUgKiA0MDk2IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICB9CiB9CiAKIC8vIFB1c2ggZnJhbWVzIHdpdGggdHdpY2UgdGhlIHNpemUgdGhhdCB0aGUgZW5jb2RlciByZXF1ZXN0ZWQuCiBURVNUX0YoRnJhbWVSZWFzc2VtYmxlclRlc3QsIFB1c2hEb3VibGVGcmFtZVNpemUpIHsKICAgICBBU1NFUlRfRVEoT0ssIGluaXRTdGF0dXMoKSk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fOCwKLSAgICAgICAgICAgIDIwNDggLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDIwNDggc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDEgYnl0ZXMgcGVyIHNhbXBsZSAqLywKLSAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAotICAgICAgICAgICAgMjA0ODAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAyMCAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8pOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzE2LAotICAgICAgICAgICAgNDA5NiAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMjA0OCBzYW1wbGVzICogMSBjaGFubmVsICogMiBieXRlcyBwZXIgc2FtcGxlICovLAotICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCi0gICAgICAgICAgICA0MDk2MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDIwICogMjA0OCBieXRlcy9mcmFtZSAqLyk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fRkxPQVQsCi0gICAgICAgICAgICA4MTkyIC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAyMDQ4IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiA0IGJ5dGVzIHBlciBzYW1wbGUgKi8sCi0gICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDgxOTIwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMjAgKiA0MDk2IGJ5dGVzL2ZyYW1lICovKTsKKyAgICBmb3IgKGJvb2wgc2VwYXJhdGVFb3MgOiB7ZmFsc2UsIHRydWV9KSB7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV84LAorICAgICAgICAgICAgICAgIDIwNDggLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDIwNDggc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDEgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDIwNDgwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMjAgKiAxMDI0IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNXzE2LAorICAgICAgICAgICAgICAgIDQwOTYgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDIwNDggc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDIgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDQwOTYwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMjAgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNX0ZMT0FULAorICAgICAgICAgICAgICAgIDgxOTIgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDIwNDggc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDQgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDgxOTIwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMjAgKiA0MDk2IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICB9CiB9CiAKIC8vIFB1c2ggZnJhbWVzIHdpdGggYSBsaXR0bGUgYml0IGxhcmdlciAoKzUgc2FtcGxlcykgdGhhbiB0aGUgcmVxdWVzdGVkIHNpemUuCiBURVNUX0YoRnJhbWVSZWFzc2VtYmxlclRlc3QsIFB1c2hMaXR0bGVMYXJnZXJGcmFtZVNpemUpIHsKICAgICBBU1NFUlRfRVEoT0ssIGluaXRTdGF0dXMoKSk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fOCwKLSAgICAgICAgICAgIDEwMjkgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMjkgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDEgYnl0ZXMgcGVyIHNhbXBsZSAqLywKLSAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAotICAgICAgICAgICAgMTEyNjQgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMSAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8pOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzE2LAotICAgICAgICAgICAgMjA1OCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAyOSBzYW1wbGVzICogMSBjaGFubmVsICogMiBieXRlcyBwZXIgc2FtcGxlICovLAotICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCi0gICAgICAgICAgICAyMjUyOCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDExICogMjA0OCBieXRlcy9mcmFtZSAqLyk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fRkxPQVQsCi0gICAgICAgICAgICA0MTE2IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDI5IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiA0IGJ5dGVzIHBlciBzYW1wbGUgKi8sCi0gICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDQ1MDU2IC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTEgKiA0MDk2IGJ5dGVzL2ZyYW1lICovKTsKKyAgICBmb3IgKGJvb2wgc2VwYXJhdGVFb3MgOiB7ZmFsc2UsIHRydWV9KSB7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV84LAorICAgICAgICAgICAgICAgIDEwMjkgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMjkgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDEgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDExMjY0IC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTEgKiAxMDI0IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNXzE2LAorICAgICAgICAgICAgICAgIDIwNTggLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMjkgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDIgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDIyNTI4IC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTEgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNX0ZMT0FULAorICAgICAgICAgICAgICAgIDQxMTYgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMjkgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDQgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDQ1MDU2IC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTEgKiA0MDk2IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICB9CiB9CiAKIC8vIFB1c2ggZnJhbWVzIHdpdGggYSBsaXR0bGUgYml0IHNtYWxsZXIgKC01IHNhbXBsZXMpIHRoYW4gdGhlIHJlcXVlc3RlZCBzaXplLgogVEVTVF9GKEZyYW1lUmVhc3NlbWJsZXJUZXN0LCBQdXNoTGl0dGxlU21hbGxlckZyYW1lU2l6ZSkgewogICAgIEFTU0VSVF9FUShPSywgaW5pdFN0YXR1cygpKTsKLSAgICB0ZXN0UHVzaFNhbWVTaXplKAotICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCi0gICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKLSAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKLSAgICAgICAgICAgIFBDTV84LAotICAgICAgICAgICAgMTAxOSAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAxOSBzYW1wbGVzICogMSBjaGFubmVsICogMSBieXRlcyBwZXIgc2FtcGxlICovLAotICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCi0gICAgICAgICAgICAxMDI0MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDEwICogMTAyNCBieXRlcy9mcmFtZSAqLyk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fMTYsCi0gICAgICAgICAgICAyMDM4IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDE5IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAyIGJ5dGVzIHBlciBzYW1wbGUgKi8sCi0gICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDIwNDgwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTAgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovKTsKLSAgICB0ZXN0UHVzaFNhbWVTaXplKAotICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCi0gICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKLSAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKLSAgICAgICAgICAgIFBDTV9GTE9BVCwKLSAgICAgICAgICAgIDQwNzYgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMTkgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDQgYnl0ZXMgcGVyIHNhbXBsZSAqLywKLSAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAotICAgICAgICAgICAgNDA5NjAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMCAqIDQwOTYgYnl0ZXMvZnJhbWUgKi8pOworICAgIGZvciAoYm9vbCBzZXBhcmF0ZUVvcyA6IHtmYWxzZSwgdHJ1ZX0pIHsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNXzgsCisgICAgICAgICAgICAgICAgMTAxOSAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAxOSBzYW1wbGVzICogMSBjaGFubmVsICogMSBieXRlcy9zYW1wbGUgKi8sCisgICAgICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgMTAyNDAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMCAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8sCisgICAgICAgICAgICAgICAgc2VwYXJhdGVFb3MpOworICAgICAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgICAgICBQQ01fMTYsCisgICAgICAgICAgICAgICAgMjAzOCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAxOSBzYW1wbGVzICogMSBjaGFubmVsICogMiBieXRlcy9zYW1wbGUgKi8sCisgICAgICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgMjA0ODAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMCAqIDIwNDggYnl0ZXMvZnJhbWUgKi8sCisgICAgICAgICAgICAgICAgc2VwYXJhdGVFb3MpOworICAgICAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgICAgICBQQ01fRkxPQVQsCisgICAgICAgICAgICAgICAgNDA3NiAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAxOSBzYW1wbGVzICogMSBjaGFubmVsICogNCBieXRlcy9zYW1wbGUgKi8sCisgICAgICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgNDA5NjAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMCAqIDQwOTYgYnl0ZXMvZnJhbWUgKi8sCisgICAgICAgICAgICAgICAgc2VwYXJhdGVFb3MpOworICAgIH0KIH0KIAogLy8gUHVzaCBzaW5nbGUtYnl0ZSBmcmFtZXMKIFRFU1RfRihGcmFtZVJlYXNzZW1ibGVyVGVzdCwgUHVzaFNpbmdsZUJ5dGUpIHsKICAgICBBU1NFUlRfRVEoT0ssIGluaXRTdGF0dXMoKSk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fOCwKLSAgICAgICAgICAgIDEgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKLSAgICAgICAgICAgIDEwMDAwMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDEwMDM1MiAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDk4ICogMTAyNCBieXRlcy9mcmFtZSAqLyk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fMTYsCi0gICAgICAgICAgICAxIC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgKi8sCi0gICAgICAgICAgICAxMDAwMDAgLyogY291bnQgKi8sCi0gICAgICAgICAgICAxMDAzNTIgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSA0OSAqIDIwNDggYnl0ZXMvZnJhbWUgKi8pOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNX0ZMT0FULAotICAgICAgICAgICAgMSAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzICovLAotICAgICAgICAgICAgMTAwMDAwIC8qIGNvdW50ICovLAotICAgICAgICAgICAgMTAyNDAwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMjUgKiA0MDk2IGJ5dGVzL2ZyYW1lICovKTsKKyAgICBmb3IgKGJvb2wgc2VwYXJhdGVFb3MgOiB7ZmFsc2UsIHRydWV9KSB7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV84LAorICAgICAgICAgICAgICAgIDEgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKKyAgICAgICAgICAgICAgICAxMDAwMDAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgMTAwMzUyIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gOTggKiAxMDI0IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNXzE2LAorICAgICAgICAgICAgICAgIDEgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKKyAgICAgICAgICAgICAgICAxMDAwMDAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgMTAwMzUyIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNDkgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNX0ZMT0FULAorICAgICAgICAgICAgICAgIDEgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKKyAgICAgICAgICAgICAgICAxMDAwMDAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgMTAyNDAwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMjUgKiA0MDk2IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICB9CiB9CiAKIC8vIFB1c2ggb25lIGJpZyBjaHVuay4KIFRFU1RfRihGcmFtZVJlYXNzZW1ibGVyVGVzdCwgUHVzaEJpZ0NodW5rKSB7CiAgICAgQVNTRVJUX0VRKE9LLCBpbml0U3RhdHVzKCkpOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzgsCi0gICAgICAgICAgICAxMDAwMDAgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKLSAgICAgICAgICAgIDEgLyogY291bnQgKi8sCi0gICAgICAgICAgICAxMDAzNTIgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSA5OCAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8pOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzE2LAotICAgICAgICAgICAgMTAwMDAwIC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgKi8sCi0gICAgICAgICAgICAxIC8qIGNvdW50ICovLAotICAgICAgICAgICAgMTAwMzUyIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNDkgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovKTsKLSAgICB0ZXN0UHVzaFNhbWVTaXplKAotICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCi0gICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKLSAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKLSAgICAgICAgICAgIFBDTV9GTE9BVCwKLSAgICAgICAgICAgIDEwMDAwMCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzICovLAotICAgICAgICAgICAgMSAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDEwMjQwMCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDI1ICogNDA5NiBieXRlcy9mcmFtZSAqLyk7CisgICAgZm9yIChib29sIHNlcGFyYXRlRW9zIDoge2ZhbHNlLCB0cnVlfSkgeworICAgICAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgICAgICBQQ01fOCwKKyAgICAgICAgICAgICAgICAxMDAwMDAgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDEwMDM1MiAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDk4ICogMTAyNCBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV8xNiwKKyAgICAgICAgICAgICAgICAxMDAwMDAgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDEwMDM1MiAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDQ5ICogMjA0OCBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV9GTE9BVCwKKyAgICAgICAgICAgICAgICAxMDAwMDAgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDEwMjQwMCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDI1ICogNDA5NiBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgfQogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyQnVmZmVyVXRpbHMuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmNwcAppbmRleCA1Zjg3YzY2Li4yMjEzMDAxIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyQnVmZmVyVXRpbHMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5jcHAKQEAgLTExOCw2ICsxMTgsMjIgQEAKIAogfSAgLy8gbmFtZXNwYWNlCiAKK2Jvb2wgSXNGb3JtYXRSMTBHMTBCMTBBMlN1cHBvcnRlZEZvckxlZ2FjeVJlbmRlcmluZygpIHsKKyAgICBjb25zdCBBSGFyZHdhcmVCdWZmZXJfRGVzYyBkZXNjID0geworICAgICAgICAud2lkdGggPSAzMjAsCisgICAgICAgIC5oZWlnaHQgPSAyNDAsCisgICAgICAgIC5mb3JtYXQgPSBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1IxMEcxMEIxMEEyX1VOT1JNLAorICAgICAgICAubGF5ZXJzID0gMSwKKyAgICAgICAgLnVzYWdlID0gQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0NQVV9SRUFEX1JBUkVMWSB8IEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfV1JJVEVfT0ZURU4gfAorICAgICAgICAgICAgICAgICBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX1NBTVBMRURfSU1BR0UsCisgICAgICAgIC5zdHJpZGUgPSAwLAorICAgICAgICAucmZ1MCA9IDAsCisgICAgICAgIC5yZnUxID0gMCwKKyAgICB9OworCisgICAgcmV0dXJuIEFIYXJkd2FyZUJ1ZmZlcl9pc1N1cHBvcnRlZCgmZGVzYyk7Cit9CisKIHN0YXR1c190IEltYWdlQ29weSh1aW50OF90ICppbWdCYXNlLCBjb25zdCBNZWRpYUltYWdlMiAqaW1nLCBjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KSB7CiAgICAgaWYgKHZpZXcuY3JvcCgpLndpZHRoICE9IGltZy0+bVdpZHRoIHx8IHZpZXcuY3JvcCgpLmhlaWdodCAhPSBpbWctPm1IZWlnaHQpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmgKaW5kZXggOWZhNjQyZC4uYzQ2NTFhNCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmgKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmgKQEAgLTI3LDYgKzI3LDExIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8qKgorICogQ2hlY2sgaWYgUjEwRzEwQjEwQTIgaXMgc3VwcG9ydGVkIGluIGxlZ2FjeSByZW5kZXJpbmcgcGF0aCB0aGF0IGludm9sdmVzIEdQVQorICovCitib29sIElzRm9ybWF0UjEwRzEwQjEwQTJTdXBwb3J0ZWRGb3JMZWdhY3lSZW5kZXJpbmcoKTsKKworLyoqCiAgKiBDb252ZXJ0cyBhbiBSR0IgdmlldyB0byBwbGFuYXIgWVVWIDQyMCBtZWRpYSBpbWFnZS4KICAqCiAgKiBccGFyYW0gZHN0WSAgICAgICBwb2ludGVyIHRvIG1lZGlhIGltYWdlIGJ1ZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyTWFwcGVyLmNwcAppbmRleCA0ZDkzOWZhLi5mNTU3ODMwIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyTWFwcGVyLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyTWFwcGVyLmNwcApAQCAtMjU1LDYgKzI1NSw4IEBACiAgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fU1RJTEwsIEhFVkNQcm9maWxlTWFpblN0aWxsIH0sCiAgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fSU5UUkEsIEhFVkNQcm9maWxlTWFpbiB9LAogICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEwX0lOVFJBLCBIRVZDUHJvZmlsZU1haW4xMCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEwLCBIRVZDUHJvZmlsZU1haW4xMEhEUjEwIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTAsIEhFVkNQcm9maWxlTWFpbjEwSERSMTBQbHVzIH0sCiB9OwogCiBBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNIZXZjSGRyUHJvZmlsZXMgPSB7CkBAIC0zODEsMTUgKzM4MywxNyBAQAogICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV83XzMsICBBVjFMZXZlbDczIH0sCiB9OwogCi0KIEFMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0F2MVByb2ZpbGVzID0gewotICAgIC8vIFRPRE86IHdpbGwgbmVlZCB0byBkaXNhbWJpZ3VhdGUgYmV0d2VlbiBNYWluOCBhbmQgTWFpbjEwCiAgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQVYxUHJvZmlsZU1haW44IH0sCiAgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQVYxUHJvZmlsZU1haW4xMCB9LAogICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVYxXzAsIEFWMVByb2ZpbGVNYWluMTBIRFIxMCB9LAogICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVYxXzAsIEFWMVByb2ZpbGVNYWluMTBIRFIxMFBsdXMgfSwKIH07CiAKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0F2MVRlbmJpdFByb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVYxXzAsIEFWMVByb2ZpbGVNYWluMTAgfSwKK307CisKIEFMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0F2MUhkclByb2ZpbGVzID0gewogICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVYxXzAsIEFWMVByb2ZpbGVNYWluMTBIRFIxMCB9LAogfTsKQEAgLTYwMyw5ICs2MDcsOSBAQAogfTsKIAogc3RydWN0IEF2MVByb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7Ci0gICAgQXYxUHJvZmlsZUxldmVsTWFwcGVyKGJvb2wgaXNIZHIgPSBmYWxzZSwgYm9vbCBpc0hkcjEwUGx1cyA9IGZhbHNlKSA6CisgICAgQXYxUHJvZmlsZUxldmVsTWFwcGVyKGJvb2wgaXNIZHIgPSBmYWxzZSwgYm9vbCBpc0hkcjEwUGx1cyA9IGZhbHNlLCBpbnQzMl90IGJpdERlcHRoID0gOCkgOgogICAgICAgICBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIoKSwKLSAgICAgICAgbUlzSGRyKGlzSGRyKSwgbUlzSGRyMTBQbHVzKGlzSGRyMTBQbHVzKSB7fQorICAgICAgICBtSXNIZHIoaXNIZHIpLCBtSXNIZHIxMFBsdXMoaXNIZHIxMFBsdXMpLCBtQml0RGVwdGgoYml0RGVwdGgpIHt9CiAKICAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpsZXZlbF90IGZyb20sIGludDMyX3QgKnRvKSB7CiAgICAgICAgIHJldHVybiBzQXYxTGV2ZWxzLm1hcChmcm9tLCB0byk7CkBAIC02MTQsMTkgKzYxOCwyMiBAQAogICAgICAgICByZXR1cm4gc0F2MUxldmVscy5tYXAoZnJvbSwgdG8pOwogICAgIH0KICAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKLSAgICAgICAgcmV0dXJuIG1Jc0hkcjEwUGx1cyA/IHNBdjFIZHIxMFBsdXNQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKLSAgICAgICAgICAgICAgICAgICAgIG1Jc0hkciA/IHNBdjFIZHJQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNBdjFQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgICAgICByZXR1cm4gKG1CaXREZXB0aCA9PSAxMCkgPyBzQXYxVGVuYml0UHJvZmlsZXMubWFwKGZyb20sIHRvKSA6CisgICAgICAgICAgICAgICAgICAgIG1Jc0hkcjEwUGx1cyA/IHNBdjFIZHIxMFBsdXNQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzSGRyID8gc0F2MUhkclByb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQXYxUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKICAgICB9CiAgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7Ci0gICAgICAgIHJldHVybiBtSXNIZHIxMFBsdXMgPyBzQXYxSGRyMTBQbHVzUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6Ci0gICAgICAgICAgICAgICAgICAgICBtSXNIZHIgPyBzQXYxSGRyUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQXYxUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICAgICAgcmV0dXJuIChtQml0RGVwdGggPT0gMTApID8gc0F2MVRlbmJpdFByb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICBtSXNIZHIxMFBsdXMgPyBzQXYxSGRyMTBQbHVzUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0hkciA/IHNBdjFIZHJQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0F2MVByb2ZpbGVzLm1hcChmcm9tLCB0byk7CiAgICAgfQogCiBwcml2YXRlOgogICAgIGJvb2wgbUlzSGRyOwogICAgIGJvb2wgbUlzSGRyMTBQbHVzOworICAgIGludDMyX3QgbUJpdERlcHRoOwogfTsKIAogfSAvLyBuYW1lc3BhY2UKQEAgLTY3NCw2ICs2ODEsMTggQEAKIH0KIAogLy8gc3RhdGljCitzdGQ6OnNoYXJlZF9wdHI8QzJNYXBwZXI6OlByb2ZpbGVMZXZlbE1hcHBlcj4KK0MyTWFwcGVyOjpHZXRCaXREZXB0aFByb2ZpbGVMZXZlbE1hcHBlcihzdGQ6OnN0cmluZyBtZWRpYVR5cGUsIGludDMyX3QgYml0RGVwdGgpIHsKKyAgICBzdGQ6OnRyYW5zZm9ybShtZWRpYVR5cGUuYmVnaW4oKSwgbWVkaWFUeXBlLmVuZCgpLCBtZWRpYVR5cGUuYmVnaW4oKSwgOjp0b2xvd2VyKTsKKyAgICBpZiAoYml0RGVwdGggPT0gOCkgeworICAgICAgICByZXR1cm4gR2V0UHJvZmlsZUxldmVsTWFwcGVyKG1lZGlhVHlwZSk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fQVYxICYmIGJpdERlcHRoID09IDEwKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEF2MVByb2ZpbGVMZXZlbE1hcHBlcj4oZmFsc2UsIGZhbHNlLCBiaXREZXB0aCk7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCisvLyBzdGF0aWMKIGJvb2wgQzJNYXBwZXI6Om1hcChDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKICAgICByZXR1cm4gc0JpdHJhdGVNb2Rlcy5tYXAoZnJvbSwgdG8pOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5oCmluZGV4IDc5N2M4YTguLjMzZDMwNWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuaAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyTWFwcGVyLmgKQEAgLTQzLDYgKzQzLDkgQEAKICAgICAgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxQcm9maWxlTGV2ZWxNYXBwZXI+CiAgICAgICAgIEdldEhkclByb2ZpbGVMZXZlbE1hcHBlcihzdGQ6OnN0cmluZyBtZWRpYVR5cGUsIGJvb2wgaXNIZHIxMFBsdXMgPSBmYWxzZSk7CiAKKyAgICAgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxQcm9maWxlTGV2ZWxNYXBwZXI+CisgICAgICAgIEdldEJpdERlcHRoUHJvZmlsZUxldmVsTWFwcGVyKHN0ZDo6c3RyaW5nIG1lZGlhVHlwZSwgaW50MzJfdCBiaXREZXB0aCA9IDgpOworCiAgICAgICAgIC8vIGNvbnZlcnQgYmV0d2VlbiBiaXRyYXRlcwogICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQzJDb25maWc6OmJpdHJhdGVfbW9kZV90LCBpbnQzMl90Kik7CiAgICAgICAgIHN0YXRpYyBib29sIG1hcChpbnQzMl90LCBDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3QqKTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyQnFCdWZmZXIuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJCcUJ1ZmZlci5jcHAKaW5kZXggMTY5ZGUwYy4uMDE5OTVmZCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJCcUJ1ZmZlci5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJCcUJ1ZmZlci5jcHAKQEAgLTE2LDYgKzE2LDcgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJDMkJxQnVmZmVyIgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmVfYnVmZmVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDx1aS9CdWZmZXJRdWV1ZURlZnMuaD4KQEAgLTE3MSw2ICsxNzIsOTEgQEAKICAgICByZXR1cm4gc3RhbXA7CiB9CiAKKy8vIERvIG5vdCByZWx5IG9uIEFIYXJkd2FyZUJ1ZmZlciBtb2R1bGUgZm9yIEdyYXBoaWNCdWZmZXIgaGFuZGxpbmcgc2luY2UgQUhhcmR3YXJlQnVmZmVyCisvLyBtb2R1bGUgaXMgbGlua2VkIHRvIGZyYW1ld29yayB3aGljaCBjb3VsZCBoYXZlIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIG9mIEdyYXBoaWNCdWZmZXIKKy8vIHRoYW4gbWFpbmxpbmUvdm5kayBpbXBsZW1lbnRhdGlvbi4oU2VlIGIvMjAzMzQ3NDk0LikKKy8vCisvLyBiMmgvaDJiIGJldHdlZW4gSGFyZHdhcmVCdWZmZXIgYW5kIEdyYXBoaWNCdWZmZXIgY2Fubm90IGJlIHVzZWQuIChiMmgvaDJiIGRlcGVuZCBvbgorLy8gQUhhcmR3YXJlQnVmZmVyIG1vZHVsZSBmb3IgdGhlIGNvbnZlcnNpb24gYmV0d2VlbiBIYXJkd2FyZUJ1ZmZlciBhbmQgR3JhcGhpY0J1ZmZlci4pCisvLyBoZ2JwXyBwcmVmaXhlZCBtZXRob2RzIGFyZSBhZGRlZCB0byBiZSB1c2VkIGluc3RlYWQgb2YgYjJoL2gyYi4KKy8vCisvLyBUT0RPOiBSZW1vdmUgZGVwZW5kZW5jeSB3aXRoIGV4aXN0aW5nIEFId0IgbW9kdWxlLiBBbHNvIGNsZWFuIHVwIGNvbnZlcnNpb25zLihjb252ZXJzaW9ucyBoZXJlCisvLyBhbmQgaDJiL2IyaCBjb3ZlcnNpb25zKQorY29uc3QgR3JhcGhpY0J1ZmZlciogaGdicF9BSEJ1ZmZlcl90b19HcmFwaGljQnVmZmVyKGNvbnN0IEFIYXJkd2FyZUJ1ZmZlciogYnVmZmVyKSB7CisgICAgcmV0dXJuIEdyYXBoaWNCdWZmZXI6OmZyb21BSGFyZHdhcmVCdWZmZXIoYnVmZmVyKTsKK30KKworaW50IGhnYnBfY3JlYXRlRnJvbUhhbmRsZShjb25zdCBBSGFyZHdhcmVCdWZmZXJfRGVzYyogZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiAqb3V0QnVmZmVyKSB7CisKKyAgICBpZiAoIWRlc2MgfHwgIWhhbmRsZSB8fCAhb3V0QnVmZmVyKSByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgICAgaWYgKGRlc2MtPnJmdTAgIT0gMCB8fCBkZXNjLT5yZnUxICE9IDApIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgICBpZiAoZGVzYy0+Zm9ybWF0ID09IEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfQkxPQiAmJiBkZXNjLT5oZWlnaHQgIT0gMSkKKyAgICAgICAgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworCisgICAgY29uc3QgaW50IGZvcm1hdCA9IHVpbnQzMl90KGRlc2MtPmZvcm1hdCk7CisgICAgY29uc3QgdWludDY0X3QgdXNhZ2UgPSB1aW50NjRfdChkZXNjLT51c2FnZSk7CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ2J1ZmZlcihuZXcgR3JhcGhpY0J1ZmZlcihoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljQnVmZmVyOjpIYW5kbGVXcmFwTWV0aG9kOjpDTE9ORV9IQU5ETEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT53aWR0aCwgZGVzYy0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBkZXNjLT5sYXllcnMsIHVzYWdlLCBkZXNjLT5zdHJpZGUpKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBnYnVmZmVyLT5pbml0Q2hlY2soKTsKKyAgICBpZiAoZXJyICE9IDAgfHwgZ2J1ZmZlci0+aGFuZGxlID09IDApIHJldHVybiBlcnI7CisKKyAgICAqb3V0QnVmZmVyID0gZ2J1ZmZlcjsKKworICAgIHJldHVybiA6OmFuZHJvaWQ6Ok5PX0VSUk9SOworfQorCit2b2lkIGhnYnBfZGVzY3JpYmUoY29uc3QgQUhhcmR3YXJlQnVmZmVyKiBidWZmZXIsCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjKiBvdXREZXNjKSB7CisgICAgaWYgKCFidWZmZXIgfHwgIW91dERlc2MpIHJldHVybjsKKworICAgIGNvbnN0IEdyYXBoaWNCdWZmZXIqIGdidWZmZXIgPSBoZ2JwX0FIQnVmZmVyX3RvX0dyYXBoaWNCdWZmZXIoYnVmZmVyKTsKKworICAgIG91dERlc2MtPndpZHRoID0gZ2J1ZmZlci0+Z2V0V2lkdGgoKTsKKyAgICBvdXREZXNjLT5oZWlnaHQgPSBnYnVmZmVyLT5nZXRIZWlnaHQoKTsKKyAgICBvdXREZXNjLT5sYXllcnMgPSBnYnVmZmVyLT5nZXRMYXllckNvdW50KCk7CisgICAgb3V0RGVzYy0+Zm9ybWF0ID0gdWludDMyX3QoZ2J1ZmZlci0+Z2V0UGl4ZWxGb3JtYXQoKSk7CisgICAgb3V0RGVzYy0+dXNhZ2UgPSB1aW50NjRfdChnYnVmZmVyLT5nZXRVc2FnZSgpKTsKKyAgICBvdXREZXNjLT5zdHJpZGUgPSBnYnVmZmVyLT5nZXRTdHJpZGUoKTsKKyAgICBvdXREZXNjLT5yZnUwID0gMDsKKyAgICBvdXREZXNjLT5yZnUxID0gMDsKK30KKworCitib29sIGhnYnBfaDJiKEhCdWZmZXIgY29uc3QmIGZyb20sIHNwPEdyYXBoaWNCdWZmZXI+KiB0bykgeworICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIGNvbnN0KiBkZXNjID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QUhhcmR3YXJlQnVmZmVyX0Rlc2MgY29uc3QqPigKKyAgICAgICAgICAgIGZyb20uZGVzY3JpcHRpb24uZGF0YSgpKTsKKyAgICBuYXRpdmVfaGFuZGxlX3QgY29uc3QqIGhhbmRsZSA9IGZyb20ubmF0aXZlSGFuZGxlOworICAgIGlmIChoZ2JwX2NyZWF0ZUZyb21IYW5kbGUoZGVzYywgaGFuZGxlLCB0bykgIT0gOjphbmRyb2lkOjpPSykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIGhnYnBfYjJoKHNwPEdyYXBoaWNCdWZmZXI+IGNvbnN0JiBmcm9tLCBIQnVmZmVyKiB0bywKKyAgICAgICAgIHVpbnQzMl90KiB0b0dlbmVyYXRpb25OdW1iZXIpIHsKKyAgICBpZiAoIWZyb20pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBBSGFyZHdhcmVCdWZmZXIqIGh3QnVmZmVyID0gZnJvbS0+dG9BSGFyZHdhcmVCdWZmZXIoKTsKKyAgICB0by0+bmF0aXZlSGFuZGxlLnNldFRvKAorICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90Kj4oZnJvbS0+aGFuZGxlKSwKKyAgICAgICAgICBmYWxzZSk7CisgICAgaGdicF9kZXNjcmliZSgKKyAgICAgICAgICAgIGh3QnVmZmVyLAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBSGFyZHdhcmVCdWZmZXJfRGVzYyo+KHRvLT5kZXNjcmlwdGlvbi5kYXRhKCkpKTsKKyAgICBpZiAodG9HZW5lcmF0aW9uTnVtYmVyKSB7CisgICAgICAgICp0b0dlbmVyYXRpb25OdW1iZXIgPSBmcm9tLT5nZXRHZW5lcmF0aW9uTnVtYmVyKCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBFbmQgb2YgaGdicCBtZXRob2RzIGZvciBHcmFwaGljQnVmZmVyIGNyZWF0aW9uLgorCiBib29sIGdldEdlbmVyYXRpb25OdW1iZXJBbmRVc2FnZShjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmcHJvZHVjZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZ2VuZXJhdGlvbiwgdWludDY0X3QgKnVzYWdlKSB7CiAgICAgc3RhdHVzX3Qgc3RhdHVze307CkBAIC0yMTEsNyArMjk3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgSEJ1ZmZlciBjb25zdCYgaEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbk51bWJlcil7CiAgICAgICAgICAgICAgICAgaWYgKGgyYihoU3RhdHVzLCAmc3RhdHVzKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgaDJiKGhCdWZmZXIsICZzbG90QnVmZmVyKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgaGdicF9oMmIoaEJ1ZmZlciwgJnNsb3RCdWZmZXIpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICpnZW5lcmF0aW9uID0gZ2VuZXJhdGlvbk51bWJlcjsKICAgICAgICAgICAgICAgICAgICAgKnVzYWdlID0gc2xvdEJ1ZmZlci0+Z2V0VXNhZ2UoKTsKQEAgLTQwMiw3ICs0ODgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhCdWZmZXIgY29uc3QmIGhCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbk51bWJlcil7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaDJiKGhTdGF0dXMsICZzdGF0dXMpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgyYihoQnVmZmVyLCAmc2xvdEJ1ZmZlcikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGdicF9oMmIoaEJ1ZmZlciwgJnNsb3RCdWZmZXIpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT5zZXRHZW5lcmF0aW9uTnVtYmVyKGdlbmVyYXRpb25OdW1iZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEdlbmVyYXRpb24gPSBnZW5lcmF0aW9uTnVtYmVyOwpAQCAtODA0LDcgKzg5MCw3IEBACiAKICAgICBIQnVmZmVyIGhCdWZmZXJ7fTsKICAgICB1aW50MzJfdCBoR2VuZXJhdGlvbk51bWJlcnt9OwotICAgIGlmICghYjJoKGdyYXBoaWNCdWZmZXIsICZoQnVmZmVyLCAmaEdlbmVyYXRpb25OdW1iZXIpKSB7CisgICAgaWYgKCFoZ2JwX2IyaChncmFwaGljQnVmZmVyLCAmaEJ1ZmZlciwgJmhHZW5lcmF0aW9uTnVtYmVyKSkgewogICAgICAgICBBTE9HRCgiSSB0byBPIGNvbnZlcnNpb24gZmFpbGVkIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0aWRjdC5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0aWRjdC5jcHAKaW5kZXggNjg4ZWZmYy4uZWMxYjI4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGlkY3QuY3BwCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3RpZGN0LmNwcApAQCAtNzYsNiArNzYsOCBAQAogICAgIHJldHVybiA7CiB9CiAKKy8qIElnbm9yaW5nIG92ZXJmbG93cyBhcyBpZGN0IGZ1bmN0aW9uIGV4cGVjdHMgYW5kIHVzZXMgb3ZlcmZsb3dzICovCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3RfY29sMihTaG9ydCAqYmxrKQogewogICAgIGludDMyIHgwLCB4MSwgeDMsIHg1LCB4NzsvLywgeDg7CkBAIC0xMDIsNiArMTA0LDggQEAKICAgICByZXR1cm4gOwogfQogCisvKiBJZ25vcmluZyBvdmVyZmxvd3MgYXMgaWRjdCBmdW5jdGlvbiBleHBlY3RzIGFuZCB1c2VzIG92ZXJmbG93cyAqLworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0X2NvbDMoU2hvcnQgKmJsaykKIHsKICAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OwpAQCAtMTM3LDYgKzE0MSw4IEBACiAgICAgcmV0dXJuIDsKIH0KIAorLyogSWdub3Jpbmcgb3ZlcmZsb3dzIGFzIGlkY3QgZnVuY3Rpb24gZXhwZWN0cyBhbmQgdXNlcyBvdmVyZmxvd3MgKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdF9jb2w0KFNob3J0ICpibGspCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKQEAgLTE4MCw2ICsxODYsOCBAQAogfQogCiAjaWZuZGVmIFNNQUxMX0RDVAorLyogSWdub3Jpbmcgb3ZlcmZsb3dzIGFzIGlkY3QgZnVuY3Rpb24gZXhwZWN0cyBhbmQgdXNlcyBvdmVyZmxvd3MgKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdF9jb2wweDQwKFNob3J0ICpibGspCiB7CiAgICAgaW50MzIgeDEsIHgzLCB4NSwgeDc7Ly8sIHg4OwpAQCAtMjMwLDYgKzIzOCw4IEBACiAgICAgcmV0dXJuIDsKIH0KIAorLyogSWdub3Jpbmcgb3ZlcmZsb3dzIGFzIGlkY3QgZnVuY3Rpb24gZXhwZWN0cyBhbmQgdXNlcyBvdmVyZmxvd3MgKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdF9jb2wweDEwKFNob3J0ICpibGspCiB7CiAgICAgaW50MzIgeDEsIHgzLCB4NSwgIHg3OwpAQCAtMjU2LDYgKzI2Niw4IEBACiAKICNlbmRpZiAvKiBTTUFMTF9EQ1QgKi8KIAorLyogSWdub3Jpbmcgb3ZlcmZsb3dzIGFzIGlkY3QgZnVuY3Rpb24gZXhwZWN0cyBhbmQgdXNlcyBvdmVyZmxvd3MgKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdF9jb2woU2hvcnQgKmJsaykKIHsKICAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OwpAQCAtMzY4LDYgKzM4MCw4IEBACiAgICAgcmV0dXJuOwogfQogCisvKiBJZ25vcmluZyBvdmVyZmxvd3MgYXMgaWRjdCBmdW5jdGlvbiBleHBlY3RzIGFuZCB1c2VzIG92ZXJmbG93cyAqLworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0X3JvdzJJbnRlcihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDQsIHg1OwpAQCAtNDI3LDYgKzQ0MSw4IEBACiAgICAgcmV0dXJuIDsKIH0KIAorLyogSWdub3Jpbmcgb3ZlcmZsb3dzIGFzIGlkY3QgZnVuY3Rpb24gZXhwZWN0cyBhbmQgdXNlcyBvdmVyZmxvd3MgKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdF9yb3czSW50ZXIoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KQogewogICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7CkBAIC00OTcsNiArNTEzLDggQEAKICAgICByZXR1cm4gOwogfQogCisvKiBJZ25vcmluZyBvdmVyZmxvd3MgYXMgaWRjdCBmdW5jdGlvbiBleHBlY3RzIGFuZCB1c2VzIG92ZXJmbG93cyAqLworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0X3JvdzRJbnRlcihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKQEAgLTU3Myw2ICs1OTEsOCBAQAogfQogCiAjaWZuZGVmIFNNQUxMX0RDVAorLyogSWdub3Jpbmcgb3ZlcmZsb3dzIGFzIGlkY3QgZnVuY3Rpb24gZXhwZWN0cyBhbmQgdXNlcyBvdmVyZmxvd3MgKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdF9yb3cweDQwSW50ZXIoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KQogewogICAgIGludDMyIHgxLCB4MiwgeDQsIHg1OwpAQCAtNjg2LDYgKzcwNiw4IEBACiAgICAgcmV0dXJuIDsKIH0KIAorLyogSWdub3Jpbmcgb3ZlcmZsb3dzIGFzIGlkY3QgZnVuY3Rpb24gZXhwZWN0cyBhbmQgdXNlcyBvdmVyZmxvd3MgKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdF9yb3cweDEwSW50ZXIoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KQogewogICAgIGludDMyIHgxLCB4MywgeDUsIHg3OwpAQCAtNzQxLDYgKzc2Myw4IEBACiAKICNlbmRpZiAvKiBTTUFMTF9EQ1QgKi8KIAorLyogSWdub3Jpbmcgb3ZlcmZsb3dzIGFzIGlkY3QgZnVuY3Rpb24gZXhwZWN0cyBhbmQgdXNlcyBvdmVyZmxvd3MgKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdF9yb3dJbnRlcihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKQEAgLTg2NCw2ICs4ODgsOCBAQAogICAgIHJldHVybjsKIH0KIAorLyogSWdub3Jpbmcgb3ZlcmZsb3dzIGFzIGlkY3QgZnVuY3Rpb24gZXhwZWN0cyBhbmQgdXNlcyBvdmVyZmxvd3MgKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdF9yb3cySW50cmEoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KQogewogICAgIGludDMyIHgwLCB4MSwgeDIsIHg0LCB4NTsKQEAgLTkxOSw2ICs5NDUsOCBAQAogICAgIHJldHVybiA7CiB9CiAKKy8qIElnbm9yaW5nIG92ZXJmbG93cyBhcyBpZGN0IGZ1bmN0aW9uIGV4cGVjdHMgYW5kIHVzZXMgb3ZlcmZsb3dzICovCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Rfcm93M0ludHJhKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCkKIHsKICAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OwpAQCAtOTg1LDYgKzEwMTMsOCBAQAogICAgIHJldHVybiA7CiB9CiAKKy8qIElnbm9yaW5nIG92ZXJmbG93cyBhcyBpZGN0IGZ1bmN0aW9uIGV4cGVjdHMgYW5kIHVzZXMgb3ZlcmZsb3dzICovCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Rfcm93NEludHJhKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCkKIHsKICAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OwpAQCAtMTA1OCw2ICsxMDg4LDggQEAKIH0KIAogI2lmbmRlZiBTTUFMTF9EQ1QKKy8qIElnbm9yaW5nIG92ZXJmbG93cyBhcyBpZGN0IGZ1bmN0aW9uIGV4cGVjdHMgYW5kIHVzZXMgb3ZlcmZsb3dzICovCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Rfcm93MHg0MEludHJhKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCkKIHsKICAgICBpbnQzMiAgeDEsIHgyLCB4NCwgeDU7CkBAIC0xMTY2LDYgKzExOTgsOCBAQAogICAgIHJldHVybiA7CiB9CiAKKy8qIElnbm9yaW5nIG92ZXJmbG93cyBhcyBpZGN0IGZ1bmN0aW9uIGV4cGVjdHMgYW5kIHVzZXMgb3ZlcmZsb3dzICovCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Rfcm93MHgxMEludHJhKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCkKIHsKICAgICBpbnQzMiB4MSwgeDMsIHg1LCB4NzsKQEAgLTEyMTgsNiArMTI1Miw4IEBACiB9CiAKICNlbmRpZiAvKiBTTUFMTF9EQ1QgKi8KKy8qIElnbm9yaW5nIG92ZXJmbG93cyBhcyBpZGN0IGZ1bmN0aW9uIGV4cGVjdHMgYW5kIHVzZXMgb3ZlcmZsb3dzICovCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Rfcm93SW50cmEoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KQogewogICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7CkBAIC0xMzY0LDYgKzE0MDAsOCBAQAogICAgIHJldHVybjsKIH0KIAorLyogSWdub3Jpbmcgb3ZlcmZsb3dzIGFzIGlkY3QgZnVuY3Rpb24gZXhwZWN0cyBhbmQgdXNlcyBvdmVyZmxvd3MgKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdF9yb3cyem12KFNob3J0ICpibGssIFVDaGFyICpyZWMsIFVDaGFyICpwcmVkLCBJbnQgbHgpCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDQsIHg1OwpAQCAtMTQyNCw2ICsxNDYyLDggQEAKICAgICByZXR1cm4gOwogfQogCisvKiBJZ25vcmluZyBvdmVyZmxvd3MgYXMgaWRjdCBmdW5jdGlvbiBleHBlY3RzIGFuZCB1c2VzIG92ZXJmbG93cyAqLworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0X3JvdzN6bXYoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgVUNoYXIgKnByZWQsIEludCBseCkKIHsKICAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OwpAQCAtMTQ5NSw2ICsxNTM1LDggQEAKICAgICByZXR1cm4gOwogfQogCisvKiBJZ25vcmluZyBvdmVyZmxvd3MgYXMgaWRjdCBmdW5jdGlvbiBleHBlY3RzIGFuZCB1c2VzIG92ZXJmbG93cyAqLworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0X3JvdzR6bXYoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgVUNoYXIgKnByZWQsIEludCBseCkKIHsKICAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OwpAQCAtMTU3Miw2ICsxNjE0LDggQEAKIH0KIAogI2lmbmRlZiBTTUFMTF9EQ1QKKy8qIElnbm9yaW5nIG92ZXJmbG93cyBhcyBpZGN0IGZ1bmN0aW9uIGV4cGVjdHMgYW5kIHVzZXMgb3ZlcmZsb3dzICovCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Rfcm93MHg0MHptdihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBVQ2hhciAqcHJlZCwgSW50IGx4KQogewogICAgIGludDMyIHgxLCB4MiwgeDQsIHg1OwpAQCAtMTY4Nyw2ICsxNzMxLDggQEAKICAgICByZXR1cm4gOwogfQogCisvKiBJZ25vcmluZyBvdmVyZmxvd3MgYXMgaWRjdCBmdW5jdGlvbiBleHBlY3RzIGFuZCB1c2VzIG92ZXJmbG93cyAqLworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0X3JvdzB4MTB6bXYoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgVUNoYXIgKnByZWQsIEludCBseCkKIHsKICAgICBpbnQzMiB4MSwgeDMsIHg1LCB4NzsKQEAgLTE3NDMsNiArMTc4OSw4IEBACiAKICNlbmRpZiAvKiBTTUFMTF9EQ1QgKi8KIAorLyogSWdub3Jpbmcgb3ZlcmZsb3dzIGFzIGlkY3QgZnVuY3Rpb24gZXhwZWN0cyBhbmQgdXNlcyBvdmVyZmxvd3MgKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdF9yb3d6bXYoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgVUNoYXIgKnByZWQsIEludCBseCkKIHsKICAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZW5jX2FwaS5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRlbmNfYXBpLmNwcAppbmRleCAwMGIyYWI2Li5iMjk1MjU4IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRlbmNfYXBpLmNwcAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRlbmNfYXBpLmNwcApAQCAtNTAxLDEzICs1MDEsMTYgQEAKICAgICAvKiBjaGVjayBmcmFtZSByYXRlICovCiAgICAgZm9yIChpID0gMDsgaSA8IGVuY1BhcmFtcy0+bkxheWVyczsgaSsrKQogICAgIHsKKyAgICAgICAgaWYgKGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlW2ldIDw9IDAuIHx8IGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlW2ldID4gMTIwKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIENMRUFOX1VQOworICAgICAgICB9CiAgICAgICAgIGVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGVbaV0gPSBlbmNPcHRpb24tPmVuY0ZyYW1lUmF0ZVtpXTsKICAgICB9CiAKICAgICBpZiAoZW5jUGFyYW1zLT5uTGF5ZXJzID4gMSkKICAgICB7Ci0gICAgICAgIGlmIChlbmNPcHRpb24tPmVuY0ZyYW1lUmF0ZVswXSA9PSBlbmNPcHRpb24tPmVuY0ZyYW1lUmF0ZVsxXSB8fAotICAgICAgICAgICAgICAgIGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlWzBdID09IDAuIHx8IGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlWzFdID09IDAuKSAvKiA3LzMxLzAzICovCisgICAgICAgIGlmIChlbmNPcHRpb24tPmVuY0ZyYW1lUmF0ZVswXSA9PSBlbmNPcHRpb24tPmVuY0ZyYW1lUmF0ZVsxXSkKICAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CiAgICAgfQogICAgIC8qIHNldCBtYXggZnJhbWUgcmF0ZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9tcGVnNF9oMjYzX2RlY19mdXp6ZXIuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9tcGVnNF9oMjYzX2RlY19mdXp6ZXIuY3BwCmluZGV4IDkxMmM4MjEuLjVlNjEzZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvbXBlZzRfaDI2M19kZWNfZnV6emVyLmNwcAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL21wZWc0X2gyNjNfZGVjX2Z1enplci5jcHAKQEAgLTUwLDcgKzUwLDcgQEAKIAogIHByaXZhdGU6CiAgIHRhZ3ZpZGVvRGVjQ29udHJvbHMgKm1EZWNIYW5kbGUgPSBudWxscHRyOwotICB1aW50OF90ICptT3V0cHV0QnVmZmVyW2tOdW1PdXRwdXRCdWZmZXJzXTsKKyAgdWludDhfdCAqbU91dHB1dEJ1ZmZlcltrTnVtT3V0cHV0QnVmZmVyc10gPSB7fTsKICAgYm9vbCBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgYm9vbCBtRnJhbWVzQ29uZmlndXJlZCA9IGZhbHNlOwogI2lmZGVmIE1QRUc0CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19zdGVyZW9fcHJvYy5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19zdGVyZW9fcHJvYy5jcHAKaW5kZXggNDMzOGM0My4uYzA0ZjdmMyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfc3RlcmVvX3Byb2MuY3BwCisrKyBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3N0ZXJlb19wcm9jLmNwcApAQCAtMjE5LDYgKzIxOSw5IEBACiA7IEZVTkNUSU9OIENPREUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCisjaWYgX19oYXNfYXR0cmlidXRlKG5vX3Nhbml0aXplKQorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCisjZW5kaWYKIHZvaWQgcHZtcDNfc3RfaW50ZW5zaXR5KGludDMyIHhyW1NVQkJBTkRTX05VTUJFUipGSUxURVJCQU5LX0JBTkRTXSwKICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyIHhsW1NVQkJBTkRTX05VTUJFUipGSUxURVJCQU5LX0JBTkRTXSwKICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyIGlzX3BvcywKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvQW5kcm9pZC5icAppbmRleCA1ZDk3ZDlhLi4yM2M3NGY3IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9BbmRyb2lkLmJwCkBAIC00NSwxNCArNDUsMTEgQEAKICAgICAgICAgImxpYmRhdGFzb3VyY2UiLAogICAgICAgICAibGlid2F0Y2hkb2ciLAogCi0gICAgICAgICJsaWJzdGFnZWZyaWdodCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9pZDMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZmxhY2RlYyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydCIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMmV4dHJhY3RvciIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2NvbG9ydXRpbHNfbmRrIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfbWV0YWRhdGF1dGlscyIsCiAKICAgICAgICAgImxpYm1lZGlhX21pZGlpb3dyYXBwZXIiLApAQCAtNzQsNiArNzEsOCBAQAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGliY3J5cHRvIiwKICAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAibGliaGlkbGJhc2UiLApkaWZmIC0tZ2l0IGEvbWVkaWEvamFuaXRvcnMvY29kZWNfT1dORVJTIGIvbWVkaWEvamFuaXRvcnMvY29kZWNfT1dORVJTCmluZGV4IGUyMDEzOTkuLmQ0ZWU1MWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2phbml0b3JzL2NvZGVjX09XTkVSUworKysgYi9tZWRpYS9qYW5pdG9ycy9jb2RlY19PV05FUlMKQEAgLTIsNCArMiw0IEBACiAjIGRpZmZlcmVudGlhdGVkIGZyb20gcGx1Z2lucyBjb25uZWN0aW5nIHRob3NlIGNvZGVjcyB0byBlaXRoZXIgb214IG9yIGNvZGVjMiBpbmZyYXN0cnVjdHVyZQogZXNzaWNrQGdvb2dsZS5jb20KIGxham9zQGdvb2dsZS5jb20KLW1hcmNvbmVAZ29vZ2xlLmNvbQord29uc2lrQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2phbml0b3JzL3JlbGlhYmlsaXR5X21haW5saW5lX09XTkVSUyBiL21lZGlhL2phbml0b3JzL3JlbGlhYmlsaXR5X21haW5saW5lX09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGM0ZmMyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamFuaXRvcnMvcmVsaWFiaWxpdHlfbWFpbmxpbmVfT1dORVJTCkBAIC0wLDAgKzEsNSBAQAorIyBCdWcgY29tcG9uZW50OiAxMDUxMzA5CisjIGdvL2FuZHJvaWQtbWVkaWEtcmVsYWliaWxpdHkKKworZXNzaWNrQGdvb2dsZS5jb20KK25jaGFsa29AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAKaW5kZXggOWMzMDdmZi4uYjBmMTU1YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BbmRyb2lkLmJwCkBAIC0xMzMsNiArMTMzLDcgQEAKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYnZpYnJhdG9yIiwKICAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKKyAgICAgICAgInBhY2thZ2VtYW5hZ2VyX2FpZGwtY3BwIiwKICAgICBdLAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKICAgICAgICAgImF1ZGlvZmxpbmdlci1haWRsLWNwcCIsCkBAIC0xOTcsNyArMTk4LDcgQEAKICAgICBdLAogICAgIGFwZXhfYXZhaWxhYmxlOiBbCiAgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKLSAgICAgICAgImNvbS5hbmRyb2lkLmJsdWV0b290aC51cGRhdGFibGUiLAorICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoIiwKICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAogICAgIF0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKaW5kZXggYTFkM2JkYi4uNGZmMDVlNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcApAQCAtMjA1LDE2ICsyMDUsMTggQEAKICAgICAvLyBPdGhlcndpc2UgdGhlIGNhbGxiYWNrIHRocmVhZCB3aWxsIG5ldmVyIGV4aXQuCiAgICAgc3RvcCgpOwogICAgIGlmIChtQXVkaW9SZWNvcmRUaHJlYWQgIT0gMCkgewotICAgICAgICBtUHJveHktPmludGVycnVwdCgpOwogICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQtPnJlcXVlc3RFeGl0KCk7ICAvLyBzZWUgY29tbWVudCBpbiBBdWRpb1JlY29yZC5oCisgICAgICAgIG1Qcm94eS0+aW50ZXJydXB0KCk7CiAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7CiAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC5jbGVhcigpOwogICAgIH0KLSAgICAvLyBObyBsb2NrIGhlcmU6IHdvcnN0IGNhc2Ugd2UgcmVtb3ZlIGEgTlVMTCBjYWxsYmFjayB3aGljaCB3aWxsIGJlIGEgbm9wCisKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwICYmIG1JbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICAvLyBUaGlzIG1heSBub3Qgc3RvcCBhbGwgb2YgdGhlc2UgZGV2aWNlIGNhbGxiYWNrcyEKICAgICAgICAgLy8gVE9ETzogQWRkIHNvbWUgc29ydCBvZiBwcm90ZWN0aW9uLgogICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtSW5wdXQsIG1Qb3J0SWQpOworICAgICAgICBtRGV2aWNlQ2FsbGJhY2suY2xlYXIoKTsKICAgICB9CiB9CiBzdGF0dXNfdCBBdWRpb1JlY29yZDo6c2V0KApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCmluZGV4IGYxZWVhYTMuLjRiZmFmZTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKQEAgLTE5NjAsOCArMTk2MCw4IEBACiAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZV9vcihmYWxzZSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAotICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4qIGZvcm1hdHMpIHsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRId09mZmxvYWRGb3JtYXRzU3VwcG9ydGVkRm9yQmx1ZXRvb3RoTWVkaWEoCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiogZm9ybWF0cykgewogICAgIGlmIChmb3JtYXRzID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CkBAIC0xOTcxLDggKzE5NzEsMTAgQEAKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIAogICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4gZm9ybWF0c0FpZGw7CisgICAgaW50MzJfdCBkZXZpY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfaW50MzJfdChkZXZpY2UpKTsKKwogICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCi0gICAgICAgICAgICBhcHMtPmdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoJmZvcm1hdHNBaWRsKSkpOworICAgICAgICAgICAgYXBzLT5nZXRId09mZmxvYWRGb3JtYXRzU3VwcG9ydGVkRm9yQmx1ZXRvb3RoTWVkaWEoZGV2aWNlQWlkbCwgJmZvcm1hdHNBaWRsKSkpOwogICAgICpmb3JtYXRzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+Pihmb3JtYXRzQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdF9hdWRpb19mb3JtYXRfdCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcAppbmRleCAzYmM2NjZiLi5mMGExMDVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcApAQCAtMzUzLDEyICszNTMsMTMgQEAKICAgICAvLyBPdGhlcndpc2UgdGhlIGNhbGxiYWNrIHRocmVhZCB3aWxsIG5ldmVyIGV4aXQuCiAgICAgc3RvcCgpOwogICAgIGlmIChtQXVkaW9UcmFja1RocmVhZCAhPSAwKSB7IC8vIG5vdCB0aHJlYWQgc2FmZQotICAgICAgICBtUHJveHktPmludGVycnVwdCgpOwogICAgICAgICBtQXVkaW9UcmFja1RocmVhZC0+cmVxdWVzdEV4aXQoKTsgICAvLyBzZWUgY29tbWVudCBpbiBBdWRpb1RyYWNrLmgKKyAgICAgICAgbVByb3h5LT5pbnRlcnJ1cHQoKTsKICAgICAgICAgbUF1ZGlvVHJhY2tUaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOwogICAgICAgICBtQXVkaW9UcmFja1RocmVhZC5jbGVhcigpOwogICAgIH0KLSAgICAvLyBObyBsb2NrIGhlcmU6IHdvcnN0IGNhc2Ugd2UgcmVtb3ZlIGEgTlVMTCBjYWxsYmFjayB3aGljaCB3aWxsIGJlIGEgbm9wCisKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwICYmIG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgLy8gVGhpcyBtYXkgbm90IHN0b3AgYWxsIG9mIHRoZXNlIGRldmljZSBjYWxsYmFja3MhCiAgICAgICAgIC8vIFRPRE86IEFkZCBzb21lIHNvcnQgb2YgcHJvdGVjdGlvbi4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2tTaGFyZWQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKaW5kZXggMzU3MTliZS4uZTNiNzliMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKQEAgLTQwOSw3ICs0MDksNyBAQAogICAgICAgICBhbmRyb2lkX2F0b21pY19vcihDQkxLX0ZVVEVYX1dBS0UsICZjYmxrLT5tRnV0ZXgpOwogICAgICAgICAvLyBpdCBzZWVtcyB0aGF0IGEgRlVURVhfV0FLRV9QUklWQVRFIHdpbGwgbm90IHdha2UgYSBGVVRFWF9XQUlULCBldmVuIHdpdGhpbiBzYW1lIHByb2Nlc3MKICAgICAgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJmNibGstPm1GdXRleCwgbUNsaWVudEluU2VydmVyID8gRlVURVhfV0FLRV9QUklWQVRFIDogRlVURVhfV0FLRSwKLSAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgICAgICAgICBJTlRfTUFYKTsKICAgICB9CiB9CiAKQEAgLTQxOSw3ICs0MTksNyBAQAogICAgIGlmICghKGFuZHJvaWRfYXRvbWljX29yKENCTEtfSU5URVJSVVBULCAmY2Jsay0+bUZsYWdzKSAmIENCTEtfSU5URVJSVVBUKSkgewogICAgICAgICBhbmRyb2lkX2F0b21pY19vcihDQkxLX0ZVVEVYX1dBS0UsICZjYmxrLT5tRnV0ZXgpOwogICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmY2Jsay0+bUZ1dGV4LCBtQ2xpZW50SW5TZXJ2ZXIgPyBGVVRFWF9XQUtFX1BSSVZBVEUgOiBGVVRFWF9XQUtFLAotICAgICAgICAgICAgICAgIDEpOworICAgICAgICAgICAgICAgIElOVF9NQVgpOwogICAgIH0KIH0KIApAQCAtNDkwLDYgKzQ5MCw4IEBACiBzdGF0dXNfdCBBdWRpb1RyYWNrQ2xpZW50UHJveHk6OndhaXRTdHJlYW1FbmREb25lKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqcmVxdWVzdGVkKQogewogICAgIHN0cnVjdCB0aW1lc3BlYyB0b3RhbDsgICAgICAgICAgLy8gdG90YWwgZWxhcHNlZCB0aW1lIHNwZW50IHdhaXRpbmcKKyAgICBzdHJ1Y3QgdGltZXNwZWMgYmVmb3JlOworICAgIGJvb2wgYmVmb3JlSXNWYWxpZCA9IGZhbHNlOwogICAgIHRvdGFsLnR2X3NlYyA9IDA7CiAgICAgdG90YWwudHZfbnNlYyA9IDA7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CkBAIC01NzAsMTcgKzU3MiwzOCBAQAogICAgICAgICB9CiAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfYW5kKH5DQkxLX0ZVVEVYX1dBS0UsICZjYmxrLT5tRnV0ZXgpOwogICAgICAgICBpZiAoIShvbGQgJiBDQkxLX0ZVVEVYX1dBS0UpKSB7CisgICAgICAgICAgICBpZiAoIWJlZm9yZUlzVmFsaWQpIHsKKyAgICAgICAgICAgICAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmJlZm9yZSk7CisgICAgICAgICAgICAgICAgYmVmb3JlSXNWYWxpZCA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBlcnJubyA9IDA7CiAgICAgICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmY2Jsay0+bUZ1dGV4LAogICAgICAgICAgICAgICAgICAgICBtQ2xpZW50SW5TZXJ2ZXIgPyBGVVRFWF9XQUlUX1BSSVZBVEUgOiBGVVRFWF9XQUlULCBvbGQgJiB+Q0JMS19GVVRFWF9XQUtFLCB0cyk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGVycm5vKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnJvciA9IGVycm5vOyAvLyBjbG9ja19nZXR0aW1lIGNhbiBhZmZlY3QgZXJybm8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgYWZ0ZXI7CisgICAgICAgICAgICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZhZnRlcik7CisgICAgICAgICAgICAgICAgdG90YWwudHZfc2VjICs9IGFmdGVyLnR2X3NlYyAtIGJlZm9yZS50dl9zZWM7CisgICAgICAgICAgICAgICAgLy8gVXNlIGF1dG8gaW5zdGVhZCBvZiBsb25nIHRvIGF2b2lkIHRoZSBnb29nbGUtcnVudGltZS1pbnQgd2FybmluZy4KKyAgICAgICAgICAgICAgICBhdXRvIGRlbHRhTnMgPSBhZnRlci50dl9uc2VjIC0gYmVmb3JlLnR2X25zZWM7CisgICAgICAgICAgICAgICAgaWYgKGRlbHRhTnMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbHRhTnMgKz0gMTAwMDAwMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgdG90YWwudHZfc2VjLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgodG90YWwudHZfbnNlYyArPSBkZWx0YU5zKSA+PSAxMDAwMDAwMDAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRvdGFsLnR2X25zZWMgLT0gMTAwMDAwMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgdG90YWwudHZfc2VjKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJlZm9yZSA9IGFmdGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChlcnJvcikgewogICAgICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgIC8vIG5vcm1hbCB3YWtldXAgYnkgc2VydmVyLCBvciBieSBiaW5kZXJEaWVkKCkKICAgICAgICAgICAgIGNhc2UgRVdPVUxEQkxPQ0s6ICAvLyBiZW5pZ24gcmFjZSBjb25kaXRpb24gd2l0aCBzZXJ2ZXIKICAgICAgICAgICAgIGNhc2UgRUlOVFI6ICAgICAgICAvLyB3YWl0IHdhcyBpbnRlcnJ1cHRlZCBieSBzaWduYWwgb3Igb3RoZXIgc3B1cmlvdXMgd2FrZXVwCiAgICAgICAgICAgICBjYXNlIEVUSU1FRE9VVDogICAgLy8gdGltZS1vdXQgZXhwaXJlZAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBlcnJubzsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBlcnJvcjsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXMgdW5leHBlY3RlZCBlcnJvciAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihzdGF0dXMpKTsKICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKICAgICAgICAgICAgIH0KQEAgLTc0Nyw3ICs3NzAsNyBAQAogICAgICAgICAgICAgaW50MzJfdCBvbGQgPSBhbmRyb2lkX2F0b21pY19vcihDQkxLX0ZVVEVYX1dBS0UsICZjYmxrLT5tRnV0ZXgpOwogICAgICAgICAgICAgaWYgKCEob2xkICYgQ0JMS19GVVRFWF9XQUtFKSkgewogICAgICAgICAgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZjYmxrLT5tRnV0ZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50SW5TZXJ2ZXIgPyBGVVRFWF9XQUtFX1BSSVZBVEUgOiBGVVRFWF9XQUtFLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBS0VfUFJJVkFURSA6IEZVVEVYX1dBS0UsIElOVF9NQVgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1GbHVzaGVkICs9IChuZXdGcm9udCAtIGZyb250KSAmIG1hc2s7CkBAIC05MTcsNyArOTQwLDcgQEAKICAgICAgICAgaW50MzJfdCBvbGQgPSBhbmRyb2lkX2F0b21pY19vcihDQkxLX0ZVVEVYX1dBS0UsICZjYmxrLT5tRnV0ZXgpOwogICAgICAgICBpZiAoIShvbGQgJiBDQkxLX0ZVVEVYX1dBS0UpKSB7CiAgICAgICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmY2Jsay0+bUZ1dGV4LAotICAgICAgICAgICAgICAgICAgICBtQ2xpZW50SW5TZXJ2ZXIgPyBGVVRFWF9XQUtFX1BSSVZBVEUgOiBGVVRFWF9XQUtFLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgbUNsaWVudEluU2VydmVyID8gRlVURVhfV0FLRV9QUklWQVRFIDogRlVURVhfV0FLRSwgSU5UX01BWCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5haWRsCmluZGV4IDRjMzk1NWEuLmZjMzc1NzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuYWlkbApAQCAtMjkzLDcgKzI5Myw3IEBACiAgICAgdm9pZCBnZXRSZXBvcnRlZFN1cnJvdW5kRm9ybWF0cyhpbm91dCBJbnQgY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgQXVkaW9Gb3JtYXRbXSBmb3JtYXRzKTsKIAotICAgIEF1ZGlvRm9ybWF0W10gZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgpOworICAgIEF1ZGlvRm9ybWF0W10gZ2V0SHdPZmZsb2FkRm9ybWF0c1N1cHBvcnRlZEZvckJsdWV0b290aE1lZGlhKGludCAvKiBhdWRpb19kZXZpY2VzX3QgKi8gZGV2aWNlKTsKIAogICAgIHZvaWQgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKEF1ZGlvRm9ybWF0IGF1ZGlvRm9ybWF0LCBib29sZWFuIGVuYWJsZWQpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKaW5kZXggOGJhMjNhZC4uYTJjZmIyYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaApAQCAtNDE1LDggKzQxNSw4IEBACiAKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwogCi0gICAgc3RhdGljIHN0YXR1c190IGdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpOworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRId09mZmxvYWRGb3JtYXRzU3VwcG9ydGVkRm9yQmx1ZXRvb3RoTWVkaWEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpOwogCiAgICAgLy8gbnVtU3Vycm91bmRGb3JtYXRzIGhvbGRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmb3JtYXRzIGFuZCBib29sIHZhbHVlIGFsbG93ZWQgaW4gdGhlIGFycmF5LgogICAgIC8vIFdoZW4gbnVtU3Vycm91bmRGb3JtYXRzIGlzIDAsIHN1cnJvdW5kRm9ybWF0cyBhbmQgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCB3aWxsIG5vdCBiZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvQ29udGFpbmVycy5jcHAgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9Db250YWluZXJzLmNwcAppbmRleCAzMTI1N2Q1Li4zZGY5Mzc4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9Db250YWluZXJzLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9Db250YWluZXJzLmNwcApAQCAtNjMsNiArNjMsMTMgQEAKICAgICByZXR1cm4gYXVkaW9EZXZpY2VJbkFsbFVzYlNldDsKIH0KIAorY29uc3QgRGV2aWNlVHlwZVNldCYgZ2V0QXVkaW9EZXZpY2VPdXRBbGxCbGVTZXQoKSB7CisgICAgc3RhdGljIGNvbnN0IERldmljZVR5cGVTZXQgYXVkaW9EZXZpY2VPdXRBbGxCbGVTZXQgPSBEZXZpY2VUeXBlU2V0KAorICAgICAgICAgICAgc3RkOjpiZWdpbihBVURJT19ERVZJQ0VfT1VUX0FMTF9CTEVfQVJSQVkpLAorICAgICAgICAgICAgc3RkOjplbmQoQVVESU9fREVWSUNFX09VVF9BTExfQkxFX0FSUkFZKSk7CisgICAgcmV0dXJuIGF1ZGlvRGV2aWNlT3V0QWxsQmxlU2V0OworfQorCiBib29sIGRldmljZVR5cGVzVG9TdHJpbmcoY29uc3QgRGV2aWNlVHlwZVNldCAmZGV2aWNlVHlwZXMsIHN0ZDo6c3RyaW5nICZzdHIpIHsKICAgICBpZiAoZGV2aWNlVHlwZXMuZW1wdHkoKSkgewogICAgICAgICBzdHIgPSAiRW1wdHkgZGV2aWNlIHR5cGVzIjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvQ29udGFpbmVycy5oIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Db250YWluZXJzLmgKaW5kZXggMjA0YjM2NS4uNjBiNDJmYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Db250YWluZXJzLmgKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Db250YWluZXJzLmgKQEAgLTQwLDYgKzQwLDcgQEAKIGNvbnN0IERldmljZVR5cGVTZXQmIGdldEF1ZGlvRGV2aWNlT3V0QWxsVXNiU2V0KCk7CiBjb25zdCBEZXZpY2VUeXBlU2V0JiBnZXRBdWRpb0RldmljZUluQWxsU2V0KCk7CiBjb25zdCBEZXZpY2VUeXBlU2V0JiBnZXRBdWRpb0RldmljZUluQWxsVXNiU2V0KCk7Citjb25zdCBEZXZpY2VUeXBlU2V0JiBnZXRBdWRpb0RldmljZU91dEFsbEJsZVNldCgpOwogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogc3RhdGljIHN0ZDo6dmVjdG9yPFQ+IEludGVyc2VjdGlvbihjb25zdCBzdGQ6OnNldDxUPiYgYSwgY29uc3Qgc3RkOjpzZXQ8VD4mIGIpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmNwcAppbmRleCBlNDIwZDA3Li5jMTlkMmMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuY3BwCkBAIC05NCw3ICs5NCw3IEBACiB9ICAvLyBuYW1lc3BhY2UKIAogdm9pZCogY3JlYXRlUHJlZmVycmVkSW1wbChjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGludGVyZmFjZSkgewotICAgIGZvciAoYXV0byB2ZXJzaW9uID0gZGV0YWlsOjpzQXVkaW9IQUxWZXJzaW9uczsgdmVyc2lvbiAhPSBudWxscHRyOyArK3ZlcnNpb24pIHsKKyAgICBmb3IgKGF1dG8gdmVyc2lvbiA9IGRldGFpbDo6c0F1ZGlvSEFMVmVyc2lvbnM7ICp2ZXJzaW9uICE9IG51bGxwdHI7ICsrdmVyc2lvbikgewogICAgICAgICB2b2lkKiByYXdJbnRlcmZhY2UgPSBudWxscHRyOwogICAgICAgICBpZiAoaGFzSGFsU2VydmljZShwYWNrYWdlLCAqdmVyc2lvbiwgaW50ZXJmYWNlKQogICAgICAgICAgICAgICAgICYmIGNyZWF0ZUhhbFNlcnZpY2UoKnZlcnNpb24sIGludGVyZmFjZSwgJnJhd0ludGVyZmFjZSkpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jcHAKaW5kZXggMWVhZGQyNy4uY2NlZjVhYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jcHAKQEAgLTEzNSw3ICsxMzUsNiBAQAogICAgIExWTV9VSU5UMzIgZnMgPQogICAgICAgICAgICAgKExWTV9VSU5UMzIpTFZFUU5CX1NhbXBsZVJhdGVUYWJbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07IC8qIFNhbXBsZSByYXRlICovCiAgICAgTFZNX1VJTlQzMiBmYzsgICAgIC8qIEZpbHRlciBjZW50cmUgZnJlcXVlbmN5ICovCi0gICAgTFZNX0lOVDE2IFFGYWN0b3I7IC8qIEZpbHRlciBRIGZhY3RvciAqLwogCiAgICAgcEluc3RhbmNlLT5OQmFuZHMgPSBwUGFyYW1zLT5OQmFuZHM7CiAKQEAgLTE0NCw3ICsxNDMsNiBAQAogICAgICAgICAgKiBHZXQgdGhlIGZpbHRlciBzZXR0aW5ncwogICAgICAgICAgKi8KICAgICAgICAgZmMgPSAoTFZNX1VJTlQzMilwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV0uRnJlcXVlbmN5OyAvKiBHZXQgdGhlIGJhbmQgY2VudHJlIGZyZXF1ZW5jeSAqLwotICAgICAgICBRRmFjdG9yID0gKExWTV9JTlQxNilwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV0uUUZhY3RvcjsgLyogR2V0IHRoZSBiYW5kIFEgZmFjdG9yICovCiAKICAgICAgICAgcEluc3RhbmNlLT5wQmlxdWFkVHlwZVtpXSA9IExWRVFOQl9TaW5nbGVQcmVjaXNpb25fRmxvYXQ7IC8qIERlZmF1bHQgdG8gc2luZ2xlIHByZWNpc2lvbiAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jcHAKaW5kZXggOGU2MzUwMi4uZmZlZDZkNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Db250cm9sLmNwcApAQCAtNDIxLDcgKzQyMSw2IEBACiAgICAgICogSW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBhbmQgdGVtcG9yYXJ5IHZhbHVlcwogICAgICAqLwogICAgIExWTV9GTE9BVCBUMDsKLSAgICBMVk1fRkxPQVQgRDsKICAgICBMVk1fRkxPQVQgQTA7CiAgICAgTFZNX0ZMT0FUIEIxOwogICAgIExWTV9GTE9BVCBCMjsKQEAgLTQ0NCw5ICs0NDMsNiBAQAogICAgICAqIENhbGN1bGF0aW5nIHRoZSBpbnRlcm1lZGlhdGUgdmFsdWVzCiAgICAgICovCiAgICAgVDAgPSBGcmVxdWVuY3kgKiBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtGc107IC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLwotICAgIEQgPSAzMjAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjAwMDAwMCAoMSoxMDAqMl41KSAqLwotICAgIC8qIEZvcmNlIEQgPSAxIDogdGhlIGZ1bmN0aW9uIHdhcyBvcmlnaW5hbGx5IHVzZWQgZm9yIGEgcGVha2luZyBmaWx0ZXIuCi0gICAgICAgVGhlIEQgcGFyYW1ldGVyIGRvIG5vdCBleGlzdCBmb3IgYSBCYW5kUGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzICovCiAKICAgICAvKgogICAgICAqIENhbGN1bGF0ZSB0aGUgQjIgY29lZmZpY2llbnQKQEAgLTUzNSw3ICs1MzEsNiBAQAogICAgICAqIEludGVybWVkaWF0ZSB2YXJpYWJsZXMgYW5kIHRlbXBvcmFyeSB2YWx1ZXMKICAgICAgKi8KICAgICBMVk1fRkxPQVQgVDA7Ci0gICAgTFZNX0ZMT0FUIEQ7CiAgICAgTFZNX0ZMT0FUIEEwOwogICAgIExWTV9GTE9BVCBCMTsKICAgICBMVk1fRkxPQVQgQjI7CkBAIC01NTgsOSArNTUzLDYgQEAKICAgICAgKiBDYWxjdWxhdGluZyB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlcwogICAgICAqLwogICAgIFQwID0gRnJlcXVlbmN5ICogTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbRnNdOyAvKiBUMCA9IDIgKiBQaSAqIEZjIC8gRnMgKi8KLSAgICBEID0gMzIwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMDAwMDAgKDEqMTAwKjJeNSkgKi8KLSAgICAvKiBGb3JjZSBEID0gMSA6IHRoZSBmdW5jdGlvbiB3YXMgb3JpZ2luYWxseSB1c2VkIGZvciBhIHBlYWtpbmcgZmlsdGVyLgotICAgICAgIFRoZSBEIHBhcmFtZXRlciBkbyBub3QgZXhpc3QgZm9yIGEgQmFuZFBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwogCiAgICAgLyoKICAgICAgKiBDYWxjdWxhdGUgdGhlIEIyIGNvZWZmaWNpZW50CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvLmNsYW5nLWZvcm1hdCBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy8uY2xhbmctZm9ybWF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBmMWI0ZjY5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy8uY2xhbmctZm9ybWF0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vLi4vLi4vLi4vYnVpbGQvc29vbmcvc2NyaXB0cy9zeXN0ZW0tY2xhbmctZm9ybWF0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL2NvcnJlbGF0aW9uLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9jb3JyZWxhdGlvbi5jcHAKaW5kZXggZWI1NmZjMy4uMDg1MzY3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL2NvcnJlbGF0aW9uLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvdGVzdHMvY29ycmVsYXRpb24uY3BwCkBAIC0zNiw3ICszNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogc2lnWSwgaW50IGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IGVuYWJsZUNyb3NzQ29ycikgewogICAgIGZsb2F0IG1heENvcnJWYWwgPSAwLmYsIHByZXZDb3JyVmFsID0gMC5mOwotICAgIGludCBkZWxheSA9IDAsIHBlYWtJbmRleCA9IDAsIGZsYWcgPSAwOworICAgIGludCBwZWFrSW5kZXggPSAwLCBmbGFnID0gMDsKICAgICBpbnQgbG9vcExpbSA9ICgxID09IGVuYWJsZUNyb3NzQ29ycikgPyBsZW4gOiBrTWluTG9vcExpbWl0VmFsdWU7CiAgICAgc3RkOjp2ZWN0b3I8aW50PiBwZWFrSW5kZXhWZWN0KGtOdW1QZWFrcywgMCk7CiAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHBlYWtWYWx1ZVZlY3Qoa051bVBlYWtzLCAwLmYpOwpAQCAtNDcsNyArNDcsNiBAQAogICAgICAgICB9CiAgICAgICAgIGNvcnJWYWwgLz0gbGVuIC0gaTsKICAgICAgICAgaWYgKGNvcnJWYWwgPiBtYXhDb3JyVmFsKSB7Ci0gICAgICAgICAgICBkZWxheSA9IGk7CiAgICAgICAgICAgICBtYXhDb3JyVmFsID0gY29yclZhbDsKICAgICAgICAgfQogICAgICAgICAvLyBDb3JyZWxhdGlvbiBwZWFrcyBhcmUgZXhwZWN0ZWQgdG8gYmUgb2JzZXJ2ZWQgYXQgZXF1YWwgaW50ZXJ2YWxzLiBUaGUgaW50ZXJ2YWwgbGVuZ3RoIGlzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5jcHAgYi9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5jcHAKaW5kZXggMjczZDkxYy4uZmNhYzU1MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuY3BwCisrKyBiL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcApAQCAtMTUsNiArMTUsNyBAQAogICovCiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlICJpbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmgiCiAjZGVmaW5lIExPR19UQUcgIkhlaWZEZWNvZGVySW1wbCIKIAogI2luY2x1ZGUgIkhlaWZEZWNvZGVySW1wbC5oIgpAQCAtNDY0LDcgKzQ2NSw3IEBACiB9CiAKIGJvb2wgSGVpZkRlY29kZXJJbXBsOjpzZXRPdXRwdXRDb2xvcihIZWlmQ29sb3JGb3JtYXQgaGVpZkNvbG9yKSB7Ci0gICAgaWYgKGhlaWZDb2xvciA9PSBtT3V0cHV0Q29sb3IpIHsKKyAgICBpZiAoaGVpZkNvbG9yID09IChIZWlmQ29sb3JGb3JtYXQpbU91dHB1dENvbG9yKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKaW5kZXggZTk4ZDdkOC4uOWMxYjU2MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCkBAIC0zNzgsMTIgKzM3OCwxMiBAQAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAicmVzb3VyY2VtYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJyZXNvdXJjZW1hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrIiwKICAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKICAgICBdLAogCiAgICAgZXhwb3J0X3N0YXRpY19saWJfaGVhZGVyczogWwotICAgICAgICAicmVzb3VyY2VtYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJyZXNvdXJjZW1hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrIiwKICAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKICAgICBdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKaW5kZXggMWM5YjllNC4uNTIxNWMxYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcApAQCAtOTQ5LDYgKzk0OSw5IEBACiAgICAgICAgIG1WaWRlb1dpZHRoID0gZXh0MTsKICAgICAgICAgbVZpZGVvSGVpZ2h0ID0gZXh0MjsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQV9TVEFSVEVEOgorICAgICAgICBBTE9HVigiUmVjZWl2ZWQgbWVkaWEgc3RhcnRlZCBtZXNzYWdlIik7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgTUVESUFfTk9USUZZX1RJTUU6CiAgICAgICAgIEFMT0dWKCJSZWNlaXZlZCBub3RpZnkgdGltZSBtZXNzYWdlIik7CiAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEveHNkL3Z0cy9PV05FUlMgYi9tZWRpYS9saWJtZWRpYS94c2QvdnRzL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWYyZWJhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEveHNkL3Z0cy9PV05FUlMKQEAgLTAsMCArMSwyIEBACisjIEJ1ZyBjb21wb25lbnQ6IDE1MTg2Mgorc3VuZG9uZ2FobkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWhlbHBlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvQW5kcm9pZC5icAppbmRleCA5YjU0MTk5Li5hNDMzZmM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYWhlbHBlci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhaGVscGVyL0FuZHJvaWQuYnAKQEAgLTIwLDcgKzIwLDcgQEAKICAgICB9LAogICAgIGFwZXhfYXZhaWxhYmxlOiBbCiAgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKLSAgICAgICAgImNvbS5hbmRyb2lkLmJsdWV0b290aC51cGRhdGFibGUiLAorICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoIiwKICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAogICAgIF0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLmJwCmluZGV4IGY1NTY3OGQuLmM0MTZhNTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLmJwCkBAIC02NSw2ICs2NSw3IEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlIiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgInBhY2thZ2VtYW5hZ2VyX2FpZGwtY3BwIiwKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcAppbmRleCAyYWFiZDUzLi44Yzg2ZTE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC0yMjUsMTAgKzIyNSwyNiBAQAogICAgICAgICAgICAgIm1lZGlhLnN0YWdlZnJpZ2h0LnRodW1ibmFpbC5wcmVmZXJfaHdfY29kZWNzIiwgZmFsc2UpOwogICAgIHVpbnQzMl90IGZsYWdzID0gcHJlZmVyaHcgPyAwIDogTWVkaWFDb2RlY0xpc3Q6OmtQcmVmZXJTb2Z0d2FyZUNvZGVjczsKICAgICBWZWN0b3I8QVN0cmluZz4gbWF0Y2hpbmdDb2RlY3M7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UodHJhY2tNZXRhLCAmZm9ybWF0KTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIGZvcm1hdCA9IE5VTEw7CisgICAgfQorCisgICAgLy8gSWYgZGVjb2RpbmcgdGh1bWJuYWlsIGNoZWNrIGRlY29kZXIgc3VwcG9ydHMgdGh1bWJuYWlsIGRpbWVuc2lvbnMgaW5zdGVhZAorICAgIGludDMyX3QgdGh1bWJIZWlnaHQsIHRodW1iV2lkdGg7CisgICAgaWYgKHRodW1ibmFpbCAmJiBmb3JtYXQgIT0gTlVMTAorICAgICAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVRodW1ibmFpbEhlaWdodCwgJnRodW1iSGVpZ2h0KQorICAgICAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVRodW1ibmFpbFdpZHRoLCAmdGh1bWJXaWR0aCkpIHsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiaGVpZ2h0IiwgdGh1bWJIZWlnaHQpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJ3aWR0aCIsIHRodW1iV2lkdGgpOworICAgIH0KKwogICAgIE1lZGlhQ29kZWNMaXN0OjpmaW5kTWF0Y2hpbmdDb2RlY3MoCiAgICAgICAgICAgICBtaW1lLAogICAgICAgICAgICAgZmFsc2UsIC8qIGVuY29kZXIgKi8KICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgJm1hdGNoaW5nQ29kZWNzKTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hpbmdDb2RlY3Muc2l6ZSgpOyArK2kpIHsKQEAgLTM0OCwxMSArMzY0LDE4IEBACiAgICAgYm9vbCBwcmVmZXJodyA9IHByb3BlcnR5X2dldF9ib29sKAogICAgICAgICAgICAgIm1lZGlhLnN0YWdlZnJpZ2h0LnRodW1ibmFpbC5wcmVmZXJfaHdfY29kZWNzIiwgZmFsc2UpOwogICAgIHVpbnQzMl90IGZsYWdzID0gcHJlZmVyaHcgPyAwIDogTWVkaWFDb2RlY0xpc3Q6OmtQcmVmZXJTb2Z0d2FyZUNvZGVjczsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlOworICAgIHN0YXR1c190IGVyciA9IGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZSh0cmFja01ldGEsICZmb3JtYXQpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgZm9ybWF0ID0gTlVMTDsKKyAgICB9CisKICAgICBWZWN0b3I8QVN0cmluZz4gbWF0Y2hpbmdDb2RlY3M7CiAgICAgTWVkaWFDb2RlY0xpc3Q6OmZpbmRNYXRjaGluZ0NvZGVjcygKICAgICAgICAgICAgIG1pbWUsCiAgICAgICAgICAgICBmYWxzZSwgLyogZW5jb2RlciAqLwogICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICBmb3JtYXQsCiAgICAgICAgICAgICAmbWF0Y2hpbmdDb2RlY3MpOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaGluZ0NvZGVjcy5zaXplKCk7ICsraSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCmluZGV4IGJmZmQ3YjMuLjYzNDdiN2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKQEAgLTE2LDYgKzE2LDggQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJTdGFnZWZyaWdodFJlY29yZGVyIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfVklERU8KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAvLyBUT0RPL3dvcmthcm91bmQ6IGluY2x1ZGluZyBiYXNlIGxvZ2dpbmcgbm93IGFzIGl0IGNvbmZsaWN0cyB3aXRoIEFEZWJ1Zy5oCiAvLyBhbmQgaXQgbXVzdCBiZSBpbmNsdWRlZCBmaXJzdC4KQEAgLTE4NTYsNiArMTg1OCw3IEBACiAvLyBTZXQgdXAgdGhlIGFwcHJvcHJpYXRlIE1lZGlhU291cmNlIGRlcGVuZGluZyBvbiB0aGUgY2hvc2VuIG9wdGlvbgogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBNZWRpYVNvdXJjZSgKICAgICAgICAgICAgICAgICAgICAgICBzcDxNZWRpYVNvdXJjZT4gKm1lZGlhU291cmNlKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAobVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9ERUZBVUxUCiAgICAgICAgICAgICB8fCBtVmlkZW9Tb3VyY2UgPT0gVklERU9fU09VUkNFX0NBTUVSQSkgewogICAgICAgICBzcDxDYW1lcmFTb3VyY2U+IGNhbWVyYVNvdXJjZTsKQEAgLTE5MzYsNiArMTkzOSw3IEBACiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cFZpZGVvRW5jb2RlcigKICAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZjYW1lcmFTb3VyY2UsCiAgICAgICAgIHNwPE1lZGlhQ29kZWNTb3VyY2U+ICpzb3VyY2UpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHNvdXJjZS0+Y2xlYXIoKTsKIAogICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKQEAgLTIxMTQsNiArMjExOCw3IEBACiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwQXVkaW9FbmNvZGVyKGNvbnN0IHNwPE1lZGlhV3JpdGVyPiYgd3JpdGVyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgaWYgKE9LICE9IChzdGF0dXMgPSBjaGVja0F1ZGlvRW5jb2RlckNhcGFiaWxpdGllcygpKSkgewogICAgICAgICByZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icAppbmRleCA5ODYyNmZkLi45OTIwMmI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icApAQCAtMzAsNyArMzAsNyBAQAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAicmVzb3VyY2VtYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJyZXNvdXJjZW1hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrIiwKICAgICBdLAogCiAgICAgaW5jbHVkZV9kaXJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL0FuZHJvaWQuYnAKaW5kZXggMDQyODUwYy4uOTM3NjUwZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvQW5kcm9pZC5icApAQCAtMTA2LDggKzEwNiw4IEBACiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibWVkaWF0cmFuc2NvZGluZ19haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAotICAgICAgICAicmVzb3VyY2VvYnNlcnZlcl9haWRsX2ludGVyZmFjZS1WMS1uZGtfcGxhdGZvcm0iLAorICAgICAgICAibWVkaWF0cmFuc2NvZGluZ19haWRsX2ludGVyZmFjZS1uZGsiLAorICAgICAgICAicmVzb3VyY2VvYnNlcnZlcl9haWRsX2ludGVyZmFjZS1WMS1uZGsiLAogICAgICAgICAibGlic3RhdHNsb2dfbWVkaWEiLAogICAgIF0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvT1dORVJTIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9PV05FUlMKaW5kZXggYjA4ZDU3My4uYTQzOTNhNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9PV05FUlMKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9PV05FUlMKQEAgLTEsNSArMSw0IEBACi1jaHpAZ29vZ2xlLmNvbQotZ29rcmlzaG5hbkBnb29nbGUuY29tCi1oa3VhbmdAZ29vZ2xlLmNvbQotbG5pbHNzb25AZ29vZ2xlLmNvbQotcGF3aW5AZ29vZ2xlLmNvbQorIyBCdWcgY29tcG9uZW50OiA3NjE0MzAKKworIyBnby9hbmRyb2lkLWZ3ay1tZWRpYS1zb2x1dGlvbnMgZm9yIGluZm8gb24gYXJlYXMgb2Ygb3duZXJzaGlwLgoraW5jbHVkZSBwbGF0Zm9ybS9mcmFtZXdvcmtzL2F2Oi9tZWRpYS9qYW5pdG9ycy9tZWRpYV9zb2x1dGlvbnNfT1dORVJTCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvQ29udHJvbGxlckNsaWVudEludGVyZmFjZS5oIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL0NvbnRyb2xsZXJDbGllbnRJbnRlcmZhY2UuaAppbmRleCA5MzExZTJlLi5lYTYzZGE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvQ29udHJvbGxlckNsaWVudEludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9Db250cm9sbGVyQ2xpZW50SW50ZXJmYWNlLmgKQEAgLTY2LDcgKzY2LDcgQEAKICAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBzZXNzaW9uIGRvZXNuJ3QgZXhpc3QsIG9yIHRoZSBjbGllbnQgaXMgYWxyZWFkeSByZXF1ZXN0aW5nIHRoZQogICAgICAqIHNlc3Npb24uIFJldHVybnMgdHJ1ZSBvdGhlcndpc2UuCiAgICAgICovCi0gICAgdmlydHVhbCBib29sIGFkZENsaWVudFVpZChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLCB1aWRfdCBjbGllbnRVaWQpOworICAgIHZpcnR1YWwgYm9vbCBhZGRDbGllbnRVaWQoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwgdWlkX3QgY2xpZW50VWlkKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZXMgdGhlICh1bnNvcnRlZCkgbGlzdCBvZiBhbGwgY2xpZW50cyByZXF1ZXN0aW5nIHRoZSBzZXNzaW9uIGlkZW50aWZpZWQgYnkKQEAgLTgxLDcgKzgxLDcgQEAKICAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBzZXNzaW9uIGRvZXNuJ3QgZXhpc3QuIFJldHVybnMgdHJ1ZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgdmlydHVhbCBib29sIGdldENsaWVudFVpZHMoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90Piogb3V0X2NsaWVudFVpZHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBvdXRfY2xpZW50VWlkcykgPSAwOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+Q29udHJvbGxlckNsaWVudEludGVyZmFjZSgpID0gZGVmYXVsdDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvQW5kcm9pZC5icAppbmRleCA2MDM2MTFhLi43YTY5ODBmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9BbmRyb2lkLmJwCkBAIC0zMSw3ICszMSw3IEBACiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJtZWRpYXRyYW5zY29kaW5nX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJtZWRpYXRyYW5zY29kaW5nX2FpZGxfaW50ZXJmYWNlLW5kayIsCiAgICAgICAgICJsaWJtZWRpYXRyYW5zY29kaW5nIiwKICAgICBdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAppbmRleCAxYWExODQ4Li5hNGZiYmJjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKQEAgLTMzMDQsMTAgKzMzMDQsMTIgQEAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJuYXRpdmVfd2luZG93X3NldF9zaWRlYmFuZF9zdHJlYW0oJXApIGZhaWxlZCEgKGVyciAlZCkuIiwKICAgICAgICAgICAgICAgICBzaWRlYmFuZEhhbmRsZSwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICByZXR1cm4gT0s7CisgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShzaWRlYmFuZEhhbmRsZSk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoc2lkZWJhbmRIYW5kbGUpOworCisgICAgcmV0dXJuIGVycjsKIH0KIAogc3RhdHVzX3QgQUNvZGVjOjpzZXRWaWRlb1BvcnRGb3JtYXRUeXBlKApAQCAtNTM5NSwyMSArNTM5NywyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IG1PTVhOb2RlLT5nZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFhY0RyY1ByZXNlbnRhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVzZW50YXRpb24sIHNpemVvZihwcmVzZW50YXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhYWMtZW5jb2RlZC10YXJnZXQtbGV2ZWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbi5uRW5jb2RlZFRhcmdldExldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYWFjLWRyYy1jdXQtbGV2ZWwiLCBwcmVzZW50YXRpb24ubkRyY0N1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImFhYy1kcmMtYm9vc3QtbGV2ZWwiLCBwcmVzZW50YXRpb24ubkRyY0Jvb3N0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYWFjLWRyYy1oZWF2eS1jb21wcmVzc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uLm5IZWF2eUNvbXByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYWFjLXRhcmdldC1yZWYtbGV2ZWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbi5uVGFyZ2V0UmVmZXJlbmNlTGV2ZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhYWMtZHJjLWVmZmVjdC10eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24ubkRyY0VmZmVjdFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhYWMtZHJjLWFsYnVtLW1vZGUiLCBwcmVzZW50YXRpb24ubkRyY0FsYnVtTW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImFhYy1kcmMtb3V0cHV0LWxvdWRuZXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24ubkRyY091dHB1dExvdWRuZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYWFjLWVuY29kZWQtdGFyZ2V0LWxldmVsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbi5uRW5jb2RlZFRhcmdldExldmVsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhYWMtZHJjLWN1dC1sZXZlbCIsIHByZXNlbnRhdGlvbi5uRHJjQ3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhYWMtZHJjLWJvb3N0LWxldmVsIiwgcHJlc2VudGF0aW9uLm5EcmNCb29zdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYWFjLWRyYy1oZWF2eS1jb21wcmVzc2lvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24ubkhlYXZ5Q29tcHJlc3Npb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImFhYy10YXJnZXQtcmVmLWxldmVsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbi5uVGFyZ2V0UmVmZXJlbmNlTGV2ZWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImFhYy1kcmMtZWZmZWN0LXR5cGUiLCBwcmVzZW50YXRpb24ubkRyY0VmZmVjdFR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImFhYy1kcmMtYWxidW0tbW9kZSIsIHByZXNlbnRhdGlvbi5uRHJjQWxidW1Nb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhYWMtZHJjLW91dHB1dC1sb3VkbmVzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24ubkRyY091dHB1dExvdWRuZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTU0MzEsNiArNTQzMyw3IEBACiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMubkNoYW5uZWxzKTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBwYXJhbXMublNhbXBsZVJhdGUpOwogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJiaXRyYXRlIiwgcGFyYW1zLm5CaXRSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYWFjLXByb2ZpbGUiLCBwYXJhbXMuZUFBQ1Byb2ZpbGUpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTkyMDUsNCArOTIwOCwxOSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQUNvZGVjOjpxdWVyeVN1cHBvcnRlZFBhcmFtZXRlcnMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICpuYW1lcykgeworICAgIGlmICghbmFtZXMpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBQ29kZWM6OnN1YnNjcmliZVRvUGFyYW1ldGVycyhbW21heWJlX3VudXNlZF1dIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmbmFtZXMpIHsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFDb2RlYzo6dW5zdWJzY3JpYmVGcm9tUGFyYW1ldGVycyhbW21heWJlX3VudXNlZF1dIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmbmFtZXMpIHsKKyAgICByZXR1cm4gT0s7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icAppbmRleCBhMDUyYTcwLi5lNDdlN2ZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKQEAgLTEwOSw2ICsxMDksNyBAQAogCiAgICAgc3JjczogWwogICAgICAgICAiQ29kZWNCYXNlLmNwcCIsCisgICAgICAgICJEYXRhQ29udmVydGVyLmNwcCIsCiAgICAgICAgICJGcmFtZVJlbmRlclRyYWNrZXIuY3BwIiwKICAgICAgICAgIk1lZGlhQ29kZWNMaXN0V3JpdGVyLmNwcCIsCiAgICAgICAgICJTa2lwQ3V0QnVmZmVyLmNwcCIsCkBAIC0xMjUsNiArMTI2LDcgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLApAQCAtMjY2LDcgKzI2OCw2IEBACiAgICAgICAgICJDYWxsYmFja01lZGlhU291cmNlLmNwcCIsCiAgICAgICAgICJDYW1lcmFTb3VyY2UuY3BwIiwKICAgICAgICAgIkNhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAiLAotICAgICAgICAiRGF0YUNvbnZlcnRlci5jcHAiLAogICAgICAgICAiRnJhbWVEZWNvZGVyLmNwcCIsCiAgICAgICAgICJIZXZjVXRpbHMuY3BwIiwKICAgICAgICAgIkludGVyZmFjZVV0aWxzLmNwcCIsCkBAIC0zNDAsNiArMzQxLDcgQEAKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCiAgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCiAgICAgICAgICJsaWJhdWRpb2NsaWVudF9haWRsX2NvbnZlcnNpb24iLAorICAgICAgICAicGFja2FnZW1hbmFnZXJfYWlkbC1jcHAiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAKaW5kZXggYjUxM2U0NS4uOWY4NjU0NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZURlY29kZXIuY3BwCkBAIC0yNjIsMTMgKzI2MiwxMCBAQAogfQogCiBib29sIGlzSERSKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7Ci0gICAgdWludDMyX3Qgc3RhbmRhcmQsIHJhbmdlLCB0cmFuc2ZlcjsKKyAgICB1aW50MzJfdCBzdGFuZGFyZCwgdHJhbnNmZXI7CiAgICAgaWYgKCFmb3JtYXQtPmZpbmRJbnQzMigiY29sb3Itc3RhbmRhcmQiLCAoaW50MzJfdCopJnN0YW5kYXJkKSkgewogICAgICAgICBzdGFuZGFyZCA9IDA7CiAgICAgfQotICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXJhbmdlIiwgKGludDMyX3QqKSZyYW5nZSkpIHsKLSAgICAgICAgcmFuZ2UgPSAwOwotICAgIH0KICAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKCJjb2xvci10cmFuc2ZlciIsIChpbnQzMl90KikmdHJhbnNmZXIpKSB7CiAgICAgICAgIHRyYW5zZmVyID0gMDsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCmluZGV4IGMwMzIzNmEuLjI4NTFkYzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCkBAIC0zMTg1LDggKzMxODUsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjU2VjdXJlLCAwKTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmIChtSXNWaWRlbykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXVkaW8gY29kZWMgaXMgY3VycmVudGx5IGlnbm9yZWQuCisgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29kZWNJbmZvOjpBdHRyaWJ1dGVzIGF0dHIgPSBtQ29kZWNJbmZvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtQ29kZWNJbmZvLT5nZXRBdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE1lZGlhQ29kZWNJbmZvOjpBdHRyaWJ1dGVzKDApOworICAgICAgICAgICAgICAgICAgICBpZiAoIShhdHRyICYgTWVkaWFDb2RlY0luZm86OmtGbGFnSXNTb2Z0d2FyZU9ubHkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb2Z0d2FyZSBjb2RlYyBpcyBjdXJyZW50bHkgaWdub3JlZC4KICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZU1hbmFnZXJQcm94eS0+YWRkUmVzb3VyY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UobUZsYWdzICYga0ZsYWdJc1NlY3VyZSwgbUlzVmlkZW8pKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMzUwMiw2ICszNTA1LDIwIEBACiAKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0RHJhaW5UaGlzQnVmZmVyOgogICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBrRmxhZ1VzZUJsb2NrTW9kZWwpID09IDAgJiYgbVR1bm5lbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoImJ1ZmZlciIsICZvYmopKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZmZlciA9IHN0YXRpY19jYXN0PE1lZGlhQ29kZWNCdWZmZXIgKj4ob2JqLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBhc3luY2hyb25vdXMgbW9kZSwgb3V0cHV0IGZvcm1hdCBjaGFuZ2UgaXMgcHJvY2Vzc2VkIGltbWVkaWF0ZWx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU91dHB1dEZvcm1hdENoYW5nZUlmTmVlZGVkKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RBY3Rpdml0eU5vdGlmaWNhdGlvbklmUG9zc2libGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJDaGFubmVsLT5kaXNjYXJkQnVmZmVyKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIC8qIHNpemVfdCBpbmRleCA9ICovdXBkYXRlQnVmZmVycyhrUG9ydEluZGV4T3V0cHV0LCBtc2cpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gRkxVU0hJTkcKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcAppbmRleCA2MjQzODI4Li4yZmZlNzI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCkBAIC01MDksNiArNTA5LDI5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBwcm9maWxlID0gLTE7CisgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigicHJvZmlsZSIsICZwcm9maWxlKSkgeworICAgICAgICAgICAgaW50MzJfdCBsZXZlbCA9IC0xOworICAgICAgICAgICAgZm9ybWF0LT5maW5kSW50MzIoImxldmVsIiwgJmxldmVsKTsKKyAgICAgICAgICAgIFZlY3RvcjxNZWRpYUNvZGVjSW5mbzo6UHJvZmlsZUxldmVsPiBwcm9maWxlTGV2ZWxzOworICAgICAgICAgICAgY2FwYWJpbGl0aWVzLT5nZXRTdXBwb3J0ZWRQcm9maWxlTGV2ZWxzKCZwcm9maWxlTGV2ZWxzKTsKKyAgICAgICAgICAgIGF1dG8gaXQgPSBwcm9maWxlTGV2ZWxzLmJlZ2luKCk7CisgICAgICAgICAgICBmb3IgKDsgaXQgIT0gcHJvZmlsZUxldmVscy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlICE9IGl0LT5tUHJvZmlsZSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxldmVsID4gLTEgJiYgbGV2ZWwgPiBpdC0+bUxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGl0ID09IHByb2ZpbGVMZXZlbHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiQ29kZWMgZG9lcyBub3Qgc3VwcG9ydCBwcm9maWxlICVkIHdpdGggbGV2ZWwgJWQiLCBwcm9maWxlLCBsZXZlbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gaGF2ZW4ndCBmb3VuZCBhIHJlYXNvbiB0byBkaXNjYXJkIHRoaXMgb25lCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwCmluZGV4IDAxMDdjMzIuLmIwN2Y4ZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwCkBAIC05NDMsMTAgKzk0MywxNyBAQAogCiAgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBvdXRidWY7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRW5jb2Rlci0+Z2V0T3V0cHV0QnVmZmVyKGluZGV4LCAmb3V0YnVmKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0sgfHwgb3V0YnVmID09IE5VTEwgfHwgb3V0YnVmLT5kYXRhKCkgPT0gTlVMTAotICAgICAgICAgICAgICAgIHx8IG91dGJ1Zi0+c2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0sgfHwgb3V0YnVmID09IE5VTEwgfHwgb3V0YnVmLT5kYXRhKCkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHNpZ25hbEVPUygpOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChvdXRidWYtPnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gWmVybyBsZW5ndGggQ1NEIGJ1ZmZlcnMgYXJlIG5vdCB0cmVhdGVkIGFzIGFuIGVycm9yCisgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfQ09ERUNDT05GSUcpIHsKKyAgICAgICAgICAgICAgICAgICAgbUVuY29kZXItPnJlbGVhc2VPdXRwdXRCdWZmZXIoaW5kZXgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNpZ25hbEVPUygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmID0gbmV3IE1lZGlhQnVmZmVyKG91dGJ1Zi0+c2l6ZSgpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2tpcEN1dEJ1ZmZlci5jcHAKaW5kZXggZWU5MDE2ZC4uZGU5MTUzMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2tpcEN1dEJ1ZmZlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2tpcEN1dEJ1ZmZlci5jcHAKQEAgLTE0NSw3ICsxNDUsMTkgQEAKICAgICBpZiAoYXZhaWxhYmxlIDwgbnVtKSB7CiAgICAgICAgIGludDMyX3QgbmV3Y2FwYWNpdHkgPSBtQ2FwYWNpdHkgKyAobnVtIC0gYXZhaWxhYmxlKTsKICAgICAgICAgY2hhciAqIG5ld2J1ZmZlciA9IG5ldyBjaGFyW25ld2NhcGFjaXR5XTsKLSAgICAgICAgbWVtY3B5KG5ld2J1ZmZlciwgbUN1dEJ1ZmZlciwgbUNhcGFjaXR5KTsKKyAgICAgICAgaWYgKG1Xcml0ZUhlYWQgPCBtUmVhZEhlYWQpIHsKKyAgICAgICAgICAgIC8vIGRhdGEgaXNuJ3QgY29udGludW91cywgbmVlZCB0byBtZW1jcHkgdHdpY2UKKyAgICAgICAgICAgIC8vIHRvIG1vdmUgcHJldmlvdXMgZGF0YSB0byBuZXcgYnVmZmVyLgorICAgICAgICAgICAgc2l6ZV90IGNvcHlMZWZ0ID0gbUNhcGFjaXR5IC0gbVJlYWRIZWFkOworICAgICAgICAgICAgbWVtY3B5KG5ld2J1ZmZlciwgbUN1dEJ1ZmZlciArIG1SZWFkSGVhZCwgY29weUxlZnQpOworICAgICAgICAgICAgbWVtY3B5KG5ld2J1ZmZlciArIGNvcHlMZWZ0LCBtQ3V0QnVmZmVyLCBtV3JpdGVIZWFkKTsKKyAgICAgICAgICAgIG1SZWFkSGVhZCA9IDA7CisgICAgICAgICAgICBtV3JpdGVIZWFkICs9IGNvcHlMZWZ0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KG5ld2J1ZmZlciwgbUN1dEJ1ZmZlciArIG1SZWFkSGVhZCwgbVdyaXRlSGVhZCAtIG1SZWFkSGVhZCk7CisgICAgICAgICAgICBtV3JpdGVIZWFkIC09IG1SZWFkSGVhZDsKKyAgICAgICAgICAgIG1SZWFkSGVhZCA9IDA7CisgICAgICAgIH0KICAgICAgICAgZGVsZXRlIFtdIG1DdXRCdWZmZXI7CiAgICAgICAgIG1DYXBhY2l0eSA9IG5ld2NhcGFjaXR5OwogICAgICAgICBtQ3V0QnVmZmVyID0gbmV3YnVmZmVyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVEVTVF9NQVBQSU5HIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVEVTVF9NQVBQSU5HCmluZGV4IDdjZTI5NjguLjdkNGUxNjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RFU1RfTUFQUElORworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcKQEAgLTIwLDEzICsyMCwzNSBAQAogICAgICAgICB9LAogICAgICAgICB7CiAgICAgICAgICAgImV4Y2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2UiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkN0c01lZGlhQXVkaW9UZXN0Q2FzZXMiLAorICAgICAgIm9wdGlvbnMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAiaW5jbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAiZXhjbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5SZXF1aXJlc0RldmljZSIKICAgICAgICAgfSwKICAgICAgICAgLy8gVE9ETzogYi8xNDkzMTQ0MTkKICAgICAgICAgewotICAgICAgICAgICJleGNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLmN0cy5BdWRpb1BsYXliYWNrQ2FwdHVyZVRlc3QiCisgICAgICAgICAgImV4Y2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuYXVkaW8uY3RzLkF1ZGlvUGxheWJhY2tDYXB0dXJlVGVzdCIKICAgICAgICAgfSwKICAgICAgICAgewotICAgICAgICAgICJleGNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLmN0cy5BdWRpb1JlY29yZFRlc3QiCisgICAgICAgICAgImV4Y2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuYXVkaW8uY3RzLkF1ZGlvUmVjb3JkVGVzdCIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFQbGF5ZXJUZXN0Q2FzZXMiLAorICAgICAgIm9wdGlvbnMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAiaW5jbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAiZXhjbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5SZXF1aXJlc0RldmljZSIKICAgICAgICAgfQogICAgICAgXQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcAppbmRleCA0YzE4Zjg3Li5hNmRmNWJiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCkBAIC0xNzU5LDI0ICsxNzU5LDM5IEBACiAgICAgaWYgKG1pbWUuc3RhcnRzV2l0aCgidmlkZW8vIikgfHwgbWltZS5zdGFydHNXaXRoKCJpbWFnZS8iKSkgewogICAgICAgICBpbnQzMl90IHdpZHRoOwogICAgICAgICBpbnQzMl90IGhlaWdodDsKLSAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkgJiYgbXNnLT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7Ci0gICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKLSAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSB8fCAhbXNnLT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7CiAgICAgICAgICAgICBBTE9HVigiZGlkIG5vdCBmaW5kIHdpZHRoIGFuZC9vciBoZWlnaHQiKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHZhbHVlIG9mIHdpZHRoOiAlZCBhbmQvb3IgaGVpZ2h0OiAlZCIsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKIAotICAgICAgICBpbnQzMl90IHNhcldpZHRoLCBzYXJIZWlnaHQ7Ci0gICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigic2FyLXdpZHRoIiwgJnNhcldpZHRoKQotICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKCJzYXItaGVpZ2h0IiwgJnNhckhlaWdodCkpIHsKKyAgICAgICAgaW50MzJfdCBzYXJXaWR0aCA9IC0xLCBzYXJIZWlnaHQgPSAtMTsKKyAgICAgICAgYm9vbCBmb3VuZFdpZHRoLCBmb3VuZEhlaWdodDsKKyAgICAgICAgZm91bmRXaWR0aCA9IG1zZy0+ZmluZEludDMyKCJzYXItd2lkdGgiLCAmc2FyV2lkdGgpOworICAgICAgICBmb3VuZEhlaWdodCA9IG1zZy0+ZmluZEludDMyKCJzYXItaGVpZ2h0IiwgJnNhckhlaWdodCk7CisgICAgICAgIGlmIChmb3VuZFdpZHRoIHx8IGZvdW5kSGVpZ2h0KSB7CisgICAgICAgICAgICBpZiAoc2FyV2lkdGggPD0gMCB8fCBzYXJIZWlnaHQgPD0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHZhbHVlIG9mIHNhcldpZHRoOiAlZCBhbmQvb3Igc2FySGVpZ2h0OiAlZCIsIHNhcldpZHRoLCBzYXJIZWlnaHQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5U0FSV2lkdGgsIHNhcldpZHRoKTsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlTQVJIZWlnaHQsIHNhckhlaWdodCk7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQzMl90IGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodDsKLSAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJkaXNwbGF5LXdpZHRoIiwgJmRpc3BsYXlXaWR0aCkKLSAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigiZGlzcGxheS1oZWlnaHQiLCAmZGlzcGxheUhlaWdodCkpIHsKKyAgICAgICAgaW50MzJfdCBkaXNwbGF5V2lkdGggPSAtMSwgZGlzcGxheUhlaWdodCA9IC0xOworICAgICAgICBmb3VuZFdpZHRoID0gbXNnLT5maW5kSW50MzIoImRpc3BsYXktd2lkdGgiLCAmZGlzcGxheVdpZHRoKTsKKyAgICAgICAgZm91bmRIZWlnaHQgPSBtc2ctPmZpbmRJbnQzMigiZGlzcGxheS1oZWlnaHQiLCAmZGlzcGxheUhlaWdodCk7CisgICAgICAgIGlmIChmb3VuZFdpZHRoIHx8IGZvdW5kSGVpZ2h0KSB7CisgICAgICAgICAgICBpZiAoZGlzcGxheVdpZHRoIDw9IDAgfHwgZGlzcGxheUhlaWdodCA8PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgdmFsdWUgb2YgZGlzcGxheVdpZHRoOiAlZCBhbmQvb3IgZGlzcGxheUhlaWdodDogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleURpc3BsYXlXaWR0aCwgZGlzcGxheVdpZHRoKTsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlEaXNwbGF5SGVpZ2h0LCBkaXNwbGF5SGVpZ2h0KTsKICAgICAgICAgfQpAQCAtMTc4NiwxNyArMTgwMSwyOSBAQAogICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJpcy1kZWZhdWx0IiwgJmlzUHJpbWFyeSkgJiYgaXNQcmltYXJ5KSB7CiAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRyYWNrSXNEZWZhdWx0LCAxKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludDMyX3QgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0LCBncmlkUm93cywgZ3JpZENvbHM7Ci0gICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInRpbGUtd2lkdGgiLCAmdGlsZVdpZHRoKSkgeworICAgICAgICAgICAgaW50MzJfdCB0aWxlV2lkdGggPSAtMSwgdGlsZUhlaWdodCA9IC0xOworICAgICAgICAgICAgZm91bmRXaWR0aCA9IG1zZy0+ZmluZEludDMyKCJ0aWxlLXdpZHRoIiwgJnRpbGVXaWR0aCk7CisgICAgICAgICAgICBmb3VuZEhlaWdodCA9IG1zZy0+ZmluZEludDMyKCJ0aWxlLWhlaWdodCIsICZ0aWxlSGVpZ2h0KTsKKyAgICAgICAgICAgIGlmIChmb3VuZFdpZHRoIHx8IGZvdW5kSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgaWYgKHRpbGVXaWR0aCA8PSAwIHx8IHRpbGVIZWlnaHQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCB2YWx1ZSBvZiB0aWxlV2lkdGg6ICVkIGFuZC9vciB0aWxlSGVpZ2h0OiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRpbGVXaWR0aCwgdGlsZVdpZHRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigidGlsZS1oZWlnaHQiLCAmdGlsZUhlaWdodCkpIHsKICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGlsZUhlaWdodCwgdGlsZUhlaWdodCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImdyaWQtcm93cyIsICZncmlkUm93cykpIHsKKyAgICAgICAgICAgIGludDMyX3QgZ3JpZFJvd3MgPSAtMSwgZ3JpZENvbHMgPSAtMTsKKyAgICAgICAgICAgIGJvb2wgZm91bmRSb3dzLCBmb3VuZENvbHM7CisgICAgICAgICAgICBmb3VuZFJvd3MgPSBtc2ctPmZpbmRJbnQzMigiZ3JpZC1yb3dzIiwgJmdyaWRSb3dzKTsKKyAgICAgICAgICAgIGZvdW5kQ29scyA9IG1zZy0+ZmluZEludDMyKCJncmlkLWNvbHMiLCAmZ3JpZENvbHMpOworICAgICAgICAgICAgaWYgKGZvdW5kUm93cyB8fCBmb3VuZENvbHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZ3JpZFJvd3MgPD0gMCB8fCBncmlkQ29scyA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHZhbHVlIG9mIGdyaWRSb3dzOiAlZCBhbmQvb3IgZ3JpZENvbHM6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmlkUm93cywgZ3JpZENvbHMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5R3JpZFJvd3MsIGdyaWRSb3dzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZ3JpZC1jb2xzIiwgJmdyaWRDb2xzKSkgewogICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlHcmlkQ29scywgZ3JpZENvbHMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xODEyLDYgKzE4MzksMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BUb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcm9wUmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcm9wQm90dG9tKSkgeworICAgICAgICAgICAgaWYgKGNyb3BMZWZ0IDwgMCB8fCBjcm9wTGVmdCA+IGNyb3BSaWdodCB8fCBjcm9wUmlnaHQgPj0gd2lkdGgpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCB2YWx1ZSBvZiBjcm9wTGVmdDogJWQgYW5kL29yIGNyb3BSaWdodDogJWQiLCBjcm9wTGVmdCwgY3JvcFJpZ2h0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNyb3BUb3AgPCAwIHx8IGNyb3BUb3AgPiBjcm9wQm90dG9tIHx8IGNyb3BCb3R0b20gPj0gaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgdmFsdWUgb2YgY3JvcFRvcDogJWQgYW5kL29yIGNyb3BCb3R0b206ICVkIiwgY3JvcFRvcCwgY3JvcEJvdHRvbSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1ldGEtPnNldFJlY3Qoa0tleUNyb3BSZWN0LCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tKTsKICAgICAgICAgfQogCkBAIC0xODU1LDkgKzE4OTAsMTYgQEAKICAgICAgICAgICAgIEFMT0dWKCJkaWQgbm90IGZpbmQgY2hhbm5lbC1jb3VudCBhbmQvb3Igc2FtcGxlLXJhdGUiKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KKyAgICAgICAgLy8gY2hhbm5lbCBjb3VudCBjYW4gYmUgemVybyBpbiBzb21lIGNhc2VzIGxpa2UgbXBlZyBoCisgICAgICAgIGlmIChzYW1wbGVSYXRlIDw9IDAgfHwgbnVtQ2hhbm5lbHMgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCB2YWx1ZSBvZiBjaGFubmVsLWNvdW50OiAlZCBhbmQvb3Igc2FtcGxlLXJhdGU6ICVkIiwKKyAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywgc2FtcGxlUmF0ZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CiAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bUNoYW5uZWxzKTsKICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOwogICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wbGU7CisgICAgICAgIC8vIFRPRE86KGIvMjA0NDMwOTUyKSBhZGQgYXBwcm9wcmlhdGUgYm91bmQgY2hlY2sgZm9yIGJpdHNQZXJTYW1wbGUKICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJiaXRzLXBlci1zYW1wbGUiLCAmYml0c1BlclNhbXBsZSkpIHsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlCaXRzUGVyU2FtcGxlLCBiaXRzUGVyU2FtcGxlKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAKaW5kZXggZmI2YzRlMi4uYmIxY2IwYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwCkBAIC0zNTQsNyArMzU0LDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1wZWc0dHlwZS0+ZVByb2ZpbGUgIT0gT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmUgfHwKLSAgICAgICAgICAgICAgICBtcGVnNHR5cGUtPmVMZXZlbCAhPSBPTVhfVklERU9fTVBFRzRMZXZlbDIgfHwKKyAgICAgICAgICAgICAgICBtcGVnNHR5cGUtPmVMZXZlbCA+IE9NWF9WSURFT19NUEVHNExldmVsMiB8fAogICAgICAgICAgICAgICAgIChtcGVnNHR5cGUtPm5BbGxvd2VkUGljdHVyZVR5cGVzICYgT01YX1ZJREVPX1BpY3R1cmVUeXBlQikgfHwKICAgICAgICAgICAgICAgICBtcGVnNHR5cGUtPm5CRnJhbWVzICE9IDAgfHwKICAgICAgICAgICAgICAgICBtcGVnNHR5cGUtPm5JRENWTENUaHJlc2hvbGQgIT0gMCB8fApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmNwcAppbmRleCBjMjExNGIzLi41Yzk5Y2M5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmNwcApAQCAtMzMsNyArMzMsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAKLSNpZiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQorI2lmIGRlZmluZWQoX19BTkRST0lEX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2VuZGlmCiAKQEAgLTY1OSw3ICs2NTksNyBAQAogICAgIHJldHVybiBzOwogfQogCi0jaWYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQogLy8gc3RhdGljCiBzcDxBTWVzc2FnZT4gQU1lc3NhZ2U6OkZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwsIHNpemVfdCBtYXhOZXN0aW5nTGV2ZWwpIHsKICAgICBpbnQzMl90IHdoYXQgPSBwYXJjZWwucmVhZEludDMyKCk7CkBAIC04MjUsNyArODI1LDcgQEAKICAgICAgICAgfQogICAgIH0KIH0KLSNlbmRpZiAgLy8gIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKKyNlbmRpZiAgLy8gZGVmaW5lZChfX0FORFJPSURfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKIAogc3A8QU1lc3NhZ2U+IEFNZXNzYWdlOjpjaGFuZ2VzRnJvbShjb25zdCBzcDxjb25zdCBBTWVzc2FnZT4gJm90aGVyLCBib29sIGRlZXApIGNvbnN0IHsKICAgICBpZiAob3RoZXIgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAKaW5kZXggYjFlZDA3Ny4uYTVlMGZmOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSAiQURlYnVnLmgiCiAjaW5jbHVkZSAiQVN0cmluZy5oIgogCi0jaWYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNlbmRpZgogCkBAIC0zNjUsNyArMzY1LDcgQEAKICAgICByZXR1cm4gIXN0cmNhc2VjbXAobURhdGEgKyBtU2l6ZSAtIHN1ZmZpeExlbiwgc3VmZml4KTsKIH0KIAotI2lmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCisjaWYgZGVmaW5lZChfX0FORFJPSURfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKIC8vIHN0YXRpYwogQVN0cmluZyBBU3RyaW5nOjpGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7CiAgICAgc2l6ZV90IHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CkBAIC0zODAsNyArMzgwLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIGVycjsKIH0KLSNlbmRpZiAvLyAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQorI2VuZGlmIC8vIGRlZmluZWQoX19BTkRST0lEX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCiAKIEFTdHJpbmcgQVN0cmluZ1ByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgewogICAgIHZhX2xpc3QgYXA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWV0YURhdGEuY3BwCmluZGV4IDdmNDhjZmQuLjc3OTEzZDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWV0YURhdGEuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWV0YURhdGEuY3BwCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KIAotI2lmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCisjaWYgZGVmaW5lZChfX0FORFJPSURfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjZW5kaWYKIApAQCAtNDgsNyArNDgsNyBAQAogTWV0YURhdGE6On5NZXRhRGF0YSgpIHsKIH0KIAotI2lmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCisjaWYgZGVmaW5lZChfX0FORFJPSURfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKIC8qIHN0YXRpYyAqLwogc3A8TWV0YURhdGE+IE1ldGFEYXRhOjpjcmVhdGVGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWV0YURhdGFCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWV0YURhdGFCYXNlLmNwcAppbmRleCAzZjA1MGVhLi45ODBlYjIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhQmFzZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZXRhRGF0YUJhc2UuY3BwCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CiAKLSNpZiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQorI2lmIGRlZmluZWQoX19BTkRST0lEX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2VuZGlmCiAKQEAgLTQ1Miw3ICs0NTIsNyBAQAogICAgIH0KIH0KIAotI2lmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCisjaWYgZGVmaW5lZChfX0FORFJPSURfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKIHN0YXR1c190IE1ldGFEYXRhQmFzZTo6d3JpdGVUb1BhcmNlbChQYXJjZWwgJnBhcmNlbCkgewogICAgIHN0YXR1c190IHJldDsKICAgICBzaXplX3QgbnVtSXRlbXMgPSBtSW50ZXJuYWxEYXRhLT5tSXRlbXMuc2l6ZSgpOwpAQCAtNTMyLDcgKzUzMiw3IEBACiAgICAgQUxPR1coIm5vIG1ldGFkYXRhIGluIHBhcmNlbCIpOwogICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogfQotI2VuZGlmIC8vICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCisjZW5kaWYgLy8gZGVmaW5lZChfX0FORFJPSURfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAKaW5kZXggMGIwYWNiZi4uN2FjZjczNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLmJwCkBAIC0yOSw3ICsyOSw2IEBACiAgICAgXSwKIAogICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCiAgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAogICAgIF0sCiAKQEAgLTY1LDYgKzY0LDggQEAKIAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9odHRwbGl2ZV9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKQEAgLTc0LDMgKzc1LDggQEAKICAgICBdLAogCiB9CisKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlX2hlYWRlcnMiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCmluZGV4IDNiYWQwMTUuLjBkN2NhZGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlICJNM1VQYXJzZXIuaCIKICNpbmNsdWRlICJQbGF5bGlzdEZldGNoZXIuaCIKIAotI2luY2x1ZGUgIm1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oIgorI2luY2x1ZGUgPEFub3RoZXJQYWNrZXRTb3VyY2UuaD4KIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmgKaW5kZXggN2E2ZDQ4Ny4uY2VlYTQxZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5oCkBAIC0yNCw3ICsyNCw3IEBACiAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKLSNpbmNsdWRlICJtcGVnMnRzL0FUU1BhcnNlci5oIgorI2luY2x1ZGUgPEFUU1BhcnNlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCmluZGV4IGIyM2FhOGEuLjkwN2IzMjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcApAQCAtMjQsOSArMjQsOSBAQAogI2luY2x1ZGUgIkhUVFBEb3dubG9hZGVyLmgiCiAjaW5jbHVkZSAiTGl2ZVNlc3Npb24uaCIKICNpbmNsdWRlICJNM1VQYXJzZXIuaCIKLSNpbmNsdWRlICJpbmNsdWRlL0lEMy5oIgotI2luY2x1ZGUgIm1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oIgotI2luY2x1ZGUgIm1wZWcydHMvSGxzU2FtcGxlRGVjcnlwdG9yLmgiCisjaW5jbHVkZSA8SUQzLmg+CisjaW5jbHVkZSA8QW5vdGhlclBhY2tldFNvdXJjZS5oPgorI2luY2x1ZGUgPEhsc1NhbXBsZURlY3J5cHRvci5oPgogCiAjaW5jbHVkZSA8ZGF0YXNvdXJjZS9EYXRhVVJJU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5oCmluZGV4IDVkM2Y5YzEuLjJlMjgxNjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5oCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgogI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CiAKLSNpbmNsdWRlICJtcGVnMnRzL0FUU1BhcnNlci5oIgorI2luY2x1ZGUgPEFUU1BhcnNlci5oPgogI2luY2x1ZGUgIkxpdmVTZXNzaW9uLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQwOTdiMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9odHRwbGl2ZV9saWNlbnNlIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiaHR0cGxpdmVfZnV6emVyIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJodHRwbGl2ZV9mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9odHRwbGl2ZSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9pZDMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfbWV0YWRhdGF1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJkYXRhc291cmNlIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaHR0cGxpdmVfaGVhZGVycyIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3J5cHRvIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCisgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCisgICAgXSwKKyAgICBjb3JwdXM6IFsiY29ycHVzLyoiXSwKKyAgICBkaWN0aW9uYXJ5OiAiaHR0cGxpdmVfZnV6emVyLmRpY3QiLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9SRUFETUUubWQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNjRlYTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNTYgQEAKKyMgRnV6emVyIGZvciBsaWJzdGFnZWZyaWdodF9odHRwbGl2ZQorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgbGlic3RhZ2VmcmlnaHRfaHR0cGxpdmUgaXMgZGVzaWduZWQgYmFzZWQgb24gdGhlIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGxpYnJhcnkgYW5kIHRyaWVzIHRvIGFjaGlldmUgdGhlIGZvbGxvd2luZzoKKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcmUgbm90IGhhcmRjb2RlZCwgYnV0IGluc3RlYWQgc2VsZWN0ZWQgYmFzZWQgb24KK2luY29taW5nIGRhdGEuQWxzbywgc2V2ZXJhbCAubTN1OCBmaWxlcyBhcmUgaGFuZC1jcmFmdGVkIGFuZCBhZGRlZCB0byB0aGUgY29ycHVzIGRpcmVjdG9yeSB0byBpbmNyZWFzZSB0aGUgY29kZSBjb3ZlcmFnZS4gVGhpcyBlbnN1cmVzIG1vcmUgY29kZSBwYXRocyBhcmUgcmVhY2hlZCBieSB0aGUgZnV6emVyLgorCitsaWJzdGFnZWZyaWdodF9odHRwbGl2ZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisxLiBGaW5hbCBSZXN1bHQgKHBhcmFtZXRlciBuYW1lOiBgZmluYWxSZXN1bHRgKQorMi4gRmxhZ3MgKHBhcmFtZXRlciBuYW1lOiBgZmxhZ3NgKQorMy4gVGltZSBVcyAocGFyYW1ldGVyIG5hbWU6IGB0aW1lVXNgKQorNC4gVHJhY2sgSW5kZXggKHBhcmFtZXRlciBuYW1lOiBgdHJhY2tJbmRleGApCis1LiBJbmRleCAocGFyYW1ldGVyIG5hbWU6IGBpbmRleGApCis2LiBTZWxlY3QgKHBhcmFtZXRlciBuYW1lOiBgc2VsZWN0YCkKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8IGBmaW5hbFJlc3VsdGAgfCBgLTM0YCB0byBgLTFgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8IGBmbGFnc2AgfCBgMGAgdG8gYDFgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8IGB0aW1lVXNgIHwgYDBgIHRvIGAxMDAwMDAwMGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3wgYHRyYWNrSW5kZXhgIHwgYFVJTlQzMl9NSU5gIHRvIGBVSU5UMzJfTUFYYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfCBgaW5kZXhgIHwgYFVJTlQzMl9NSU5gIHRvIGBVSU5UMzJfTUFYYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfCBgc2VsZWN0YCB8IGBUcnVlYCB0byBgRmFsc2VgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8CisKK1RoaXMgYWxzbyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiBpcyBhbHdheXMgZGV0ZXJtaW5pc3RpYyBmb3IgYW55IGdpdmVuIGlucHV0LgorCisjIyMjIyBNYXhpbWl6ZSB1dGlsaXphdGlvbiBvZiBpbnB1dCBkYXRhCitUaGUgcGx1Z2luIGZlZWRzIHRoZSBlbnRpcmUgaW5wdXQgZGF0YSB0byB0aGUgaHR0cGxpdmUgbW9kdWxlLgorVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiB0b2xlcmF0ZXMgYW55IGtpbmQgb2YgaW5wdXQgKGVtcHR5LCBodWdlLAorbWFsZm9ybWVkLCBldGMpIGFuZCBkb2VzbnQgYGV4aXQoKWAgb24gYW55IGlucHV0IGFuZCB0aGVyZWJ5IGluY3JlYXNpbmcgdGhlCitjaGFuY2Ugb2YgaWRlbnRpZnlpbmcgdnVsbmVyYWJpbGl0aWVzLgorCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBodHRwbGl2ZV9mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorCisjIyMjIFN0ZXBzIHRvIGJ1aWxkCitCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIGh0dHBsaXZlX2Z1enplcgorYGBgCisjIyMjIFN0ZXBzIHRvIHJ1bgorVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHB1c2ggJEFORFJPSURfUFJPRFVDVF9PVVQvZGF0YS9mdXp6LyQoVEFSR0VUX0FSQ0gpL2xpYiAvZGF0YS9mdXp6LyQoVEFSR0VUX0FSQ0gpL2xpYgorICAkIGFkYiBwdXNoICRBTkRST0lEX1BST0RVQ1RfT1VUL2RhdGEvZnV6ei8kKFRBUkdFVF9BUkNIKS9odHRwbGl2ZV9mdXp6ZXIgL2RhdGEvZnV6ei8kKFRBUkdFVF9BUkNIKS9odHRwbGl2ZV9mdXp6ZXIKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei8ke1RBUkdFVF9BUkNIfS9odHRwbGl2ZV9mdXp6ZXIvaHR0cGxpdmVfZnV6emVyIC9kYXRhL2Z1enovJHtUQVJHRVRfQVJDSH0vaHR0cGxpdmVfZnV6emVyL2NvcnB1cworYGBgCisKKyMjIFJlZmVyZW5jZXM6CisgKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAorICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9jcnlwdC5rZXkgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2NyeXB0LmtleQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWQ1ZDdmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9jcnlwdC5rZXkKQEAgLTAsMCArMSwyIEBACivbCiuBz4z80DXQiV9470jOMwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9lbmNyeXB0ZWQubTN1OCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvZW5jcnlwdGVkLm0zdTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJiMGVhYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvZW5jcnlwdGVkLm0zdTgKQEAgLTAsMCArMSwxMiBAQAorI0VYVE0zVQorI0VYVC1YLVRBUkdFVERVUkFUSU9OOjEwCisjRVhULVgtQUxMT1ctQ0FDSEU6WUVTCisjRVhULVgtUExBWUxJU1QtVFlQRTpWT0QKKyNFWFQtWC1WRVJTSU9OOjMKKyNFWFQtWC1NRURJQS1TRVFVRU5DRToxCisjRVhULVgtS0VZOk1FVEhPRD1BRVMtMTI4LFVSST0iLi4vLi4vZnV6ei9hcm02NC9odHRwbGl2ZV9mdXp6ZXIvY29ycHVzL2NyeXB0LmtleSIKKyNFWFRJTkY6MTAuMDAwLAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UxLnRzCisjRVhUSU5GOjUuMDkyLAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UxLnRzCisjRVhULVgtRU5ETElTVApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9obHMubTN1OCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaGxzLm0zdTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzOGUwNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaGxzLm0zdTgKQEAgLTAsMCArMSw4IEBACisjRVhUTTNVCisjRVhULVgtVEFSR0VURFVSQVRJT046MTAKKyNFWFQtWC1NRURJQS1TRVFVRU5DRTowCisjRVhUSU5GOjEwLCBubyBkZXNjCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTEudHMKKyNFWFRJTkY6MTAsIG5vIGRlc2MKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMi50cworI0VYVC1YLUVORExJU1QKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXgxLm0zdTggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4MS5tM3U4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZWZmNTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4MS5tM3U4CkBAIC0wLDAgKzEsMTQgQEAKKyNFWFRNM1UKKyNFWFQtWC1WRVJTSU9OOjQKKyNFWFQtWC1UQVJHRVREVVJBVElPTjo1CisjRVhULVgtS0VZOk1FVEhPRD1OT05FCisjRVhULVgtRElTQ09OVElOVUlUWS1TRVFVRU5DRTowCisjRVhULVgtUExBWUxJU1QtVFlQRTpWT0QKKyNFWFRJTkY6NSwKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMC50cworI0VYVC1YLURJU0NPTlRJTlVJVFkKKyNFWFRJTkY6NSwKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMS50cworI0VYVElORjo1LAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UyLnRzCisjRVhULVgtRU5ETElTVApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDIubTN1OCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXgyLm0zdTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhMDE4OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXgyLm0zdTgKQEAgLTAsMCArMSw2IEBACisjRVhUTTNVCisjRVhULVgtSU5ERVBFTkRFTlQtU0VHTUVOVFMKKyNFWFQtWC1TVFJFQU0tSU5GOkNMT1NFRC1DQVBUSU9OUz1OT05FLEJBTkRXSURUSD0xNjUzNDAsUkVTT0xVVElPTj0yNTZ4MTQ0LENPREVDUz0ibXA0YS40MC41LGF2YzEuNDJjMDBiIgoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9wcm9nX2luZGV4Lm0zdTgKKyNFWFQtWC1TVFJFQU0tSU5GOkNMT1NFRC1DQVBUSU9OUz1OT05FLEJBTkRXSURUSD0zNDQzODgsUkVTT0xVVElPTj00MjZ4MjQwLENPREVDUz0ibXA0YS40MC41LGF2YzEuNGQ0MDE1IgoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9wcm9nX2luZGV4MS5tM3U4CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4My5tM3U4IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDMubTN1OApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjdmNDg5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDMubTN1OApAQCAtMCwwICsxLDEzIEBACisjRVhUTTNVCisjRVhULVgtVkVSU0lPTjo0CisjRVhULVgtVEFSR0VURFVSQVRJT046NQorI0VYVC1YLUtFWTpNRVRIT0Q9QUVTLTEyOCxVUkk9Imh0dHBzOi8vZGVtby51bmlmaWVkLXN0cmVhbWluZy5jb20vdmlkZW8vdGVhcnMtb2Ytc3RlZWwvYWVzLmtleSIsSVY9MFg5OWI3NDAwN2I2MjU0ZTRiZDFjNmUwMzYzMWNhZDE1YgorI0VYVC1YLVBMQVlMSVNULVRZUEU6Vk9ECisjRVhUSU5GOjUsCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTEudHMKKyNFWFQtWC1ESVNDT05USU5VSVRZCisjRVhUSU5GOjUsCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTIudHMKKyNFWFRJTkY6NSwKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMy50cworI0VYVC1YLUVORExJU1QKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXg0Lm0zdTggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4NC5tM3U4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YmEzN2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4NC5tM3U4CkBAIC0wLDAgKzEsMTUgQEAKKyNFWFRNM1UKKyNFWFQtWC1WRVJTSU9OOjQKKyNFWFQtWC1UQVJHRVREVVJBVElPTjo1CisjRVhULVgtS0VZOk1FVEhPRD1TQU1QTEUtQUVTLFVSST0iZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgsYTRjZDk5OTVhMWFhOTFlMSIsSVY9MFg5OWI3NDAwN2I2MjU0ZTRiZDFjNmUwMzYzMWNhZDE1YgorI0VYVC1YLURJU0NPTlRJTlVJVFktU0VRVUVOQ0U6MAorI0VYVC1YLVBMQVlMSVNULVRZUEU6Vk9ECisjRVhULVgtRElTQ09OVElOVUlUWQorI0VYVElORjo1LAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UwLnRzCisjRVhUSU5GOjUsCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTEudHMKKyNFWFQtWC1ESVNDT05USU5VSVRZCisjRVhUSU5GOjUsCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTIudHMKKyNFWFQtWC1FTkRMSVNUCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4NS5tM3U4IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDUubTN1OApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTIwZGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDUubTN1OApAQCAtMCwwICsxLDE0IEBACisjRVhUTTNVCisjRVhULVgtVEFSR0VURFVSQVRJT046MTEKKyNFWFQtWC1LRVk6TUVUSE9EPU5PTkUKKyNFWFQtWC1NRURJQS1TRVFVRU5DRTowCisjRVhULVgtVkVSU0lPTjo0CisjRVhUSU5GOjEwLjAsCisjRVhULVgtQllURVJBTkdFOjEwQDAKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMS50cworI0VYVElORjoxMC4wLAorI0VYVC1YLUJZVEVSQU5HRToyMEAxMAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UxLnRzCisjRVhUSU5GOjEwLjAsCisjRVhULVgtQllURVJBTkdFOjgwCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTEudHMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXg2Lm0zdTggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4Ni5tM3U4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ODM2OGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4Ni5tM3U4CkBAIC0wLDAgKzEsMTIgQEAKKyNFWFRNM1UKKyNFWFQtWC1WRVJTSU9OOjQKKyNFWFQtWC1UQVJHRVREVVJBVElPTjo1CisjRVhULVgtS0VZOk1FVEhPRD1BRVMtMTI4LFVSST0iZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgsYTRjZDk5OTVhMWFhOTFlMSIsSVY9MHgzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMAorI0VYVC1YLVBMQVlMSVNULVRZUEU6Vk9ECisjRVhUSU5GOjUsCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTEudHMKKyNFWFRJTkY6NSwKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMi50cworI0VYVElORjo1LAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UzLnRzCisjRVhULVgtRU5ETElTVApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDcubTN1OCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXg3Lm0zdTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA5OTQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXg3Lm0zdTgKQEAgLTAsMCArMSw0NiBAQAorI0VYVE0zVQorI0VYVC1YLVZFUlNJT046NAorIyMgQ3JlYXRlZCB3aXRoIFVuaWZpZWQgU3RyZWFtaW5nIFBsYXRmb3JtICAodmVyc2lvbj0xLjExLjMtMjQ0MzgpCisjRVhULVgtU0VTU0lPTi1LRVk6TUVUSE9EPUFFUy0xMjgsVVJJPSJodHRwczovL2RlbW8udW5pZmllZC1zdHJlYW1pbmcuY29tL3ZpZGVvL3RlYXJzLW9mLXN0ZWVsL2Flcy5rZXkiCisKKyMgQVVESU8gZ3JvdXBzCisjRVhULVgtTUVESUE6VFlQRT1BVURJTyxHUk9VUC1JRD0iYXVkaW8tYWFjbC02NCIsTEFOR1VBR0U9ImVuIixOQU1FPSJFbmdsaXNoIixERUZBVUxUPVlFUyxBVVRPU0VMRUNUPVlFUyxDSEFOTkVMUz0iMiIKKyNFWFQtWC1NRURJQTpUWVBFPUFVRElPLEdST1VQLUlEPSJhdWRpby1hYWNsLTEyOCIsTEFOR1VBR0U9ImVuIixOQU1FPSJFbmdsaXNoIixERUZBVUxUPVlFUyxBVVRPU0VMRUNUPVlFUyxDSEFOTkVMUz0iMiIKKworIyBTVUJUSVRMRVMgZ3JvdXBzCisjRVhULVgtTUVESUE6VFlQRT1TVUJUSVRMRVMsR1JPVVAtSUQ9InRleHRzdHJlYW0iLExBTkdVQUdFPSJlbiIsTkFNRT0iRW5nbGlzaCIsREVGQVVMVD1ZRVMsQVVUT1NFTEVDVD1ZRVMsVVJJPSJ0ZWFycy1vZi1zdGVlbC1hZXMtdGV4dHN0cmVhbV9lbmc9MTAwMC5tM3U4IgorI0VYVC1YLU1FRElBOlRZUEU9U1VCVElUTEVTLEdST1VQLUlEPSJ0ZXh0c3RyZWFtIixMQU5HVUFHRT0icnUiLE5BTUU9IlJ1c3NpYW4iLEFVVE9TRUxFQ1Q9WUVTLFVSST0idGVhcnMtb2Ytc3RlZWwtYWVzLXRleHRzdHJlYW1fcnVzPTEwMDAubTN1OCIKKworIyB2YXJpYW50cworI0VYVC1YLVNUUkVBTS1JTkY6QkFORFdJRFRIPTQ5NDAwMCxDT0RFQ1M9Im1wNGEuNDAuMixhdmMxLjQyQzAwRCIsUkVTT0xVVElPTj0yMjR4MTAwLEZSQU1FLVJBVEU9MjQsQVVESU89ImF1ZGlvLWFhY2wtNjQiLFNVQlRJVExFUz0idGV4dHN0cmVhbSIsQ0xPU0VELUNBUFRJT05TPU5PTkUKK3RlYXJzLW9mLXN0ZWVsLWFlcy1hdWRpb19lbmc9NjQwMDgtdmlkZW9fZW5nPTQwMTAwMC5tM3U4CisjRVhULVgtU1RSRUFNLUlORjpCQU5EV0lEVEg9OTMzMDAwLENPREVDUz0ibXA0YS40MC4yLGF2YzEuNDJDMDE2IixSRVNPTFVUSU9OPTQ0OHgyMDAsRlJBTUUtUkFURT0yNCxBVURJTz0iYXVkaW8tYWFjbC0xMjgiLFNVQlRJVExFUz0idGV4dHN0cmVhbSIsQ0xPU0VELUNBUFRJT05TPU5PTkUKK3RlYXJzLW9mLXN0ZWVsLWFlcy1hdWRpb19lbmc9MTI4MDAyLXZpZGVvX2VuZz03NTEwMDAubTN1OAorI0VYVC1YLVNUUkVBTS1JTkY6QkFORFdJRFRIPTExOTgwMDAsQ09ERUNTPSJtcDRhLjQwLjIsYXZjMS40RDQwMUYiLFJFU09MVVRJT049Nzg0eDM1MCxGUkFNRS1SQVRFPTI0LEFVRElPPSJhdWRpby1hYWNsLTEyOCIsU1VCVElUTEVTPSJ0ZXh0c3RyZWFtIixDTE9TRUQtQ0FQVElPTlM9Tk9ORQordGVhcnMtb2Ytc3RlZWwtYWVzLWF1ZGlvX2VuZz0xMjgwMDItdmlkZW9fZW5nPTEwMDEwMDAubTN1OAorI0VYVC1YLVNUUkVBTS1JTkY6QkFORFdJRFRIPTE3MjgwMDAsQ09ERUNTPSJtcDRhLjQwLjIsYXZjMS42NDAwMjgiLFJFU09MVVRJT049MTY4MHg3NTAsRlJBTUUtUkFURT0yNCxWSURFTy1SQU5HRT1TRFIsQVVESU89ImF1ZGlvLWFhY2wtMTI4IixTVUJUSVRMRVM9InRleHRzdHJlYW0iLENMT1NFRC1DQVBUSU9OUz1OT05FCit0ZWFycy1vZi1zdGVlbC1hZXMtYXVkaW9fZW5nPTEyODAwMi12aWRlb19lbmc9MTUwMTAwMC5tM3U4CisjRVhULVgtU1RSRUFNLUlORjpCQU5EV0lEVEg9MjQ2OTAwMCxDT0RFQ1M9Im1wNGEuNDAuMixhdmMxLjY0MDAyOCIsUkVTT0xVVElPTj0xNjgweDc1MCxGUkFNRS1SQVRFPTI0LFZJREVPLVJBTkdFPVNEUixBVURJTz0iYXVkaW8tYWFjbC0xMjgiLFNVQlRJVExFUz0idGV4dHN0cmVhbSIsQ0xPU0VELUNBUFRJT05TPU5PTkUKK3RlYXJzLW9mLXN0ZWVsLWFlcy1hdWRpb19lbmc9MTI4MDAyLXZpZGVvX2VuZz0yMjAwMDAwLm0zdTgKKworIyB2YXJpYW50cworI0VYVC1YLVNUUkVBTS1JTkY6QkFORFdJRFRIPTEwMjUwMDAsQ09ERUNTPSJtcDRhLjQwLjIsaHZjMS4xLjYuTDE1MC45MCIsUkVTT0xVVElPTj0xNjgweDc1MCxGUkFNRS1SQVRFPTI0LFZJREVPLVJBTkdFPVNEUixBVURJTz0iYXVkaW8tYWFjbC02NCIsU1VCVElUTEVTPSJ0ZXh0c3RyZWFtIixDTE9TRUQtQ0FQVElPTlM9Tk9ORQordGVhcnMtb2Ytc3RlZWwtYWVzLWF1ZGlvX2VuZz02NDAwOC12aWRlb19lbmdfMT05MDIwMDAubTN1OAorI0VYVC1YLVNUUkVBTS1JTkY6QkFORFdJRFRIPTEzNjgwMDAsQ09ERUNTPSJtcDRhLjQwLjIsaHZjMS4xLjYuTDE1MC45MCIsUkVTT0xVVElPTj0yNTc2eDExNTAsRlJBTUUtUkFURT0yNCxWSURFTy1SQU5HRT1TRFIsQVVESU89ImF1ZGlvLWFhY2wtMTI4IixTVUJUSVRMRVM9InRleHRzdHJlYW0iLENMT1NFRC1DQVBUSU9OUz1OT05FCit0ZWFycy1vZi1zdGVlbC1hZXMtYXVkaW9fZW5nPTEyODAwMi12aWRlb19lbmdfMT0xMTYxMDAwLm0zdTgKKyNFWFQtWC1TVFJFQU0tSU5GOkJBTkRXSURUSD0xODE1MDAwLENPREVDUz0ibXA0YS40MC4yLGh2YzEuMS42LkwxNTAuOTAiLFJFU09MVVRJT049MzM2MHgxNTAwLEZSQU1FLVJBVEU9MjQsVklERU8tUkFOR0U9U0RSLEFVRElPPSJhdWRpby1hYWNsLTEyOCIsU1VCVElUTEVTPSJ0ZXh0c3RyZWFtIixDTE9TRUQtQ0FQVElPTlM9Tk9ORQordGVhcnMtb2Ytc3RlZWwtYWVzLWF1ZGlvX2VuZz0xMjgwMDItdmlkZW9fZW5nXzE9MTU4MzAwMC5tM3U4CisKKyMgdmFyaWFudHMKKyNFWFQtWC1TVFJFQU0tSU5GOkJBTkRXSURUSD02OTAwMCxDT0RFQ1M9Im1wNGEuNDAuMiIsQVVESU89ImF1ZGlvLWFhY2wtNjQiLFNVQlRJVExFUz0idGV4dHN0cmVhbSIKK3RlYXJzLW9mLXN0ZWVsLWFlcy1hdWRpb19lbmc9NjQwMDgubTN1OAorI0VYVC1YLVNUUkVBTS1JTkY6QkFORFdJRFRIPTEzNzAwMCxDT0RFQ1M9Im1wNGEuNDAuMiIsQVVESU89ImF1ZGlvLWFhY2wtMTI4IixTVUJUSVRMRVM9InRleHRzdHJlYW0iCit0ZWFycy1vZi1zdGVlbC1hZXMtYXVkaW9fZW5nPTEyODAwMi5tM3U4CisKKyMga2V5ZnJhbWVzCisjRVhULVgtSS1GUkFNRS1TVFJFQU0tSU5GOkJBTkRXSURUSD01NDAwMCxDT0RFQ1M9ImF2YzEuNDJDMDBEIixSRVNPTFVUSU9OPTIyNHgxMDAsVVJJPSJrZXlmcmFtZXMvdGVhcnMtb2Ytc3RlZWwtYWVzLXZpZGVvX2VuZz00MDEwMDAubTN1OCIKKyNFWFQtWC1JLUZSQU1FLVNUUkVBTS1JTkY6QkFORFdJRFRIPTEwMDAwMCxDT0RFQ1M9ImF2YzEuNDJDMDE2IixSRVNPTFVUSU9OPTQ0OHgyMDAsVVJJPSJrZXlmcmFtZXMvdGVhcnMtb2Ytc3RlZWwtYWVzLXZpZGVvX2VuZz03NTEwMDAubTN1OCIKKyNFWFQtWC1JLUZSQU1FLVNUUkVBTS1JTkY6QkFORFdJRFRIPTEzMzAwMCxDT0RFQ1M9ImF2YzEuNEQ0MDFGIixSRVNPTFVUSU9OPTc4NHgzNTAsVVJJPSJrZXlmcmFtZXMvdGVhcnMtb2Ytc3RlZWwtYWVzLXZpZGVvX2VuZz0xMDAxMDAwLm0zdTgiCisjRVhULVgtSS1GUkFNRS1TVFJFQU0tSU5GOkJBTkRXSURUSD0xMjAwMDAsQ09ERUNTPSJodmMxLjEuNi5MMTUwLjkwIixSRVNPTFVUSU9OPTE2ODB4NzUwLFZJREVPLVJBTkdFPVNEUixVUkk9ImtleWZyYW1lcy90ZWFycy1vZi1zdGVlbC1hZXMtdmlkZW9fZW5nXzE9OTAyMDAwLm0zdTgiCisjRVhULVgtSS1GUkFNRS1TVFJFQU0tSU5GOkJBTkRXSURUSD0xNTQwMDAsQ09ERUNTPSJodmMxLjEuNi5MMTUwLjkwIixSRVNPTFVUSU9OPTI1NzZ4MTE1MCxWSURFTy1SQU5HRT1TRFIsVVJJPSJrZXlmcmFtZXMvdGVhcnMtb2Ytc3RlZWwtYWVzLXZpZGVvX2VuZ18xPTExNjEwMDAubTN1OCIKKyNFWFQtWC1JLUZSQU1FLVNUUkVBTS1JTkY6QkFORFdJRFRIPTIxMDAwMCxDT0RFQ1M9Imh2YzEuMS42LkwxNTAuOTAiLFJFU09MVVRJT049MzM2MHgxNTAwLFZJREVPLVJBTkdFPVNEUixVUkk9ImtleWZyYW1lcy90ZWFycy1vZi1zdGVlbC1hZXMtdmlkZW9fZW5nXzE9MTU4MzAwMC5tM3U4IgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDgubTN1OCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXg4Lm0zdTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUzZDU4OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXg4Lm0zdTgKQEAgLTAsMCArMSwxMyBAQAorI0VYVE0zVQorI0VYVC1YLVZFUlNJT046NQorCisjRVhULVgtTUVESUE6VFlQRT1BVURJTyxHUk9VUC1JRD0iYXVkaW8iLE5BTUU9IkVuZ2xpc2ggc3RlcmVvIixMQU5HVUFHRT0iZW4iLEFVVE9TRUxFQ1Q9WUVTLFVSST0iLi4vLi4vZnV6ei9hcm02NC9odHRwbGl2ZV9mdXp6ZXIvaW5kZXgxLm0zdTgiCisKKyNFWFQtWC1TVFJFQU0tSU5GOkJBTkRXSURUSD02MjgwMDAsQ09ERUNTPSJhdmMxLjQyYzAwZCxtcDRhLjQwLjIiLFJFU09MVVRJT049MzIweDE4MCxBVURJTz0iYXVkaW8iCisuLi8uLi9mdXp6L2FybTY0L2h0dHBsaXZlX2Z1enplci9pbmRleDEubTN1OAorI0VYVC1YLVNUUkVBTS1JTkY6QkFORFdJRFRIPTkyODAwMCxDT0RFQ1M9ImF2YzEuNDJjMDBkLG1wNGEuNDAuMiIsUkVTT0xVVElPTj00ODB4MjcwLEFVRElPPSJhdWRpbyIKKy4uLy4uL2Z1enovYXJtNjQvaHR0cGxpdmVfZnV6emVyL2luZGV4Mi5tM3U4CisjRVhULVgtU1RSRUFNLUlORjpCQU5EV0lEVEg9MTcyODAwMCxDT0RFQ1M9ImF2YzEuNDJjMDBkLG1wNGEuNDAuMiIsUkVTT0xVVElPTj02NDB4MzYwLEFVRElPPSJhdWRpbyIKKy4uLy4uL2Z1enovYXJtNjQvaHR0cGxpdmVfZnV6emVyL2luZGV4My5tM3U4CisjRVhULVgtU1RSRUFNLUlORjpCQU5EV0lEVEg9MjUyODAwMCxDT0RFQ1M9ImF2YzEuNDJjMDBkLG1wNGEuNDAuMiIsUkVTT0xVVElPTj05NjB4NTQwLEFVRElPPSJhdWRpbyIKKy4uLy4uL2Z1enovYXJtNjQvaHR0cGxpdmVfZnV6emVyL2luZGV4MS5tM3U4CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL3Byb2dfaW5kZXgubTN1OCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvcHJvZ19pbmRleC5tM3U4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViODg0MjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL3Byb2dfaW5kZXgubTN1OApAQCAtMCwwICsxLDE3IEBACisjRVhUTTNVCisjRVhULVgtTUVESUE6VFlQRT1BVURJTyxHUk9VUC1JRD0iYXVkaW8iLExBTkdVQUdFPSJlbmciLE5BTUU9IkVuZ2xpc2giLEFVVE9TRUxFQ1Q9WUVTLERFRkFVTFQ9WUVTLFVSST0iY29ycHVzL2luZGV4MS5tM3U4IgorI0VYVC1YLU1FRElBOlRZUEU9QVVESU8sR1JPVVAtSUQ9ImF1ZGlvIixMQU5HVUFHRT0iZnJlIixOQU1FPSJGcmFuw6dhaXMiLEFVVE9TRUxFQ1Q9WUVTLERFRkFVTFQ9Tk8sVVJJPSJjb3JwdXMvaW5kZXgxLm0zdTgiCisjRVhULVgtTUVESUE6VFlQRT1BVURJTyxHUk9VUC1JRD0iYXVkaW8iLExBTkdVQUdFPSJzcCIsTkFNRT0iRXNwYW5vbCIsQVVUT1NFTEVDVD1ZRVMsREVGQVVMVD1OTyxVUkk9ImNvcnB1cy9pbmRleDEubTN1OCIKKyNFWFQtWC1WRVJTSU9OOjQKKyNFWFQtWC1UQVJHRVREVVJBVElPTjo1CisjRVhULVgtS0VZOk1FVEhPRD1OT05FCisjRVhULVgtRElTQ09OVElOVUlUWS1TRVFVRU5DRTowCisjRVhULVgtUExBWUxJU1QtVFlQRTpWT0QKKyNFWFRJTkY6NSwKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMS50cworI0VYVC1YLURJU0NPTlRJTlVJVFkKKyNFWFRJTkY6NSwKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMS50cworI0VYVElORjo1LAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UxLnRzCisjRVhULVgtRU5ETElTVApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2h0dHBsaXZlX2Z1enplci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvaHR0cGxpdmVfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTc3N2IzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2h0dHBsaXZlX2Z1enplci5jcHAKQEAgLTAsMCArMSwyOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+CisjaW5jbHVkZSA8TGl2ZURhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxMaXZlU2Vzc2lvbi5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXJfY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjb25zdGV4cHIgY2hhciBrRmlsZU5hbWVQcmVmaXhbXSA9ICIvZGF0YS9sb2NhbC90bXAvaHR0cGxpdmUtIjsKK2NvbnN0ZXhwciBjaGFyIGtGaWxlTmFtZVN1ZmZpeFtdID0gIi5tM3U4IjsKK2NvbnN0ZXhwciBjaGFyIGtGaWxlVXJsUHJlZml4W10gPSAiZmlsZTovLyI7Citjb25zdGV4cHIgaW50NjRfdCBrT2ZmU2V0ID0gMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtSZWFkeU1hcmtNcyA9IDUwMDA7Citjb25zdGV4cHIgaW50MzJfdCBrUHJlcGFyZU1hcmtNcyA9IDE1MDA7Citjb25zdGV4cHIgaW50MzJfdCBrRXJyb3JOb01heCA9IC0xOworY29uc3RleHByIGludDMyX3Qga0Vycm9yTm9NaW4gPSAtMzQ7Citjb25zdGV4cHIgaW50MzJfdCBrTWF4VGltZVVzID0gMTAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtSYW5kb21TdHJpbmdMZW5ndGggPSA2NDsKK2NvbnN0ZXhwciBpbnQzMl90IGtSYW5nZU1pbiA9IDA7Citjb25zdGV4cHIgaW50MzJfdCBrUmFuZ2VNYXggPSAxMDAwOworCitjb25zdGV4cHIgTGl2ZVNlc3Npb246OlN0cmVhbVR5cGUga1ZhbGlkU3RyZWFtVHlwZVtdID0geworICAgIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX0FVRElPLCBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9WSURFTywKKyAgICBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9TVUJUSVRMRVMsIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX01FVEFEQVRBfTsKKworY29uc3RleHByIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUga1ZhbGlkU2Vla01vZGVbXSA9IHsKKyAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMsCisgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZTo6U0VFS19ORVhUX1NZTkMsCisgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZTo6U0VFS19DTE9TRVNUX1NZTkMsCisgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZTo6U0VFS19DTE9TRVNULAorICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGU6OlNFRUtfRlJBTUVfSU5ERVh9OworCitjb25zdGV4cHIgbWVkaWFfdHJhY2tfdHlwZSBrVmFsaWRNZWRpYVRyYWNrVHlwZVtdID0geworICAgIE1FRElBX1RSQUNLX1RZUEVfVU5LTk9XTiwgIE1FRElBX1RSQUNLX1RZUEVfVklERU8sCisgICAgTUVESUFfVFJBQ0tfVFlQRV9BVURJTywgICAgTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQsCisgICAgTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSwgTUVESUFfVFJBQ0tfVFlQRV9NRVRBREFUQX07CisKK3N0cnVjdCBUZXN0QUhhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgeworcHVibGljOgorICBUZXN0QUhhbmRsZXIoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IHNpZ25hbEVvc0Z1bmN0aW9uKQorICAgICAgOiBtU2lnbmFsRW9zRnVuY3Rpb24oc2lnbmFsRW9zRnVuY3Rpb24pIHt9CisgIHZpcnR1YWwgflRlc3RBSGFuZGxlcigpIHt9CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGUgeworICAgIGludDMyX3Qgd2hhdCA9IC0xOworICAgIG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpOworICAgIHN3aXRjaCAod2hhdCkgeworICAgIGNhc2UgTGl2ZVNlc3Npb246OmtXaGF0RXJyb3I6CisgICAgY2FzZSBMaXZlU2Vzc2lvbjo6a1doYXRQcmVwYXJlZDoKKyAgICBjYXNlIExpdmVTZXNzaW9uOjprV2hhdFByZXBhcmF0aW9uRmFpbGVkOiB7CisgICAgICBtU2lnbmFsRW9zRnVuY3Rpb24oKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBtU2lnbmFsRW9zRnVuY3Rpb247Cit9OworCitzdHJ1Y3QgVGVzdE1lZGlhSFRUUENvbm5lY3Rpb24gOiBwdWJsaWMgTWVkaWFIVFRQQ29ubmVjdGlvbiB7CitwdWJsaWM6CisgIFRlc3RNZWRpYUhUVFBDb25uZWN0aW9uKCkge30KKyAgdmlydHVhbCB+VGVzdE1lZGlhSFRUUENvbm5lY3Rpb24oKSB7fQorCisgIHZpcnR1YWwgYm9vbCBjb25uZWN0KGNvbnN0IGNoYXIgKiAvKnVyaSovLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqIC8qaGVhZGVycyovKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpIHsgcmV0dXJuOyB9CisKKyAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IC8qb2Zmc2V0Ki8sIHZvaWQgKiAvKmRhdGEqLywgc2l6ZV90IHNpemUpIHsKKyAgICByZXR1cm4gc2l6ZTsKKyAgfQorCisgIHZpcnR1YWwgb2ZmNjRfdCBnZXRTaXplKCkgeyByZXR1cm4gMDsgfQorICB2aXJ0dWFsIHN0YXR1c190IGdldE1JTUVUeXBlKFN0cmluZzggKiAvKm1pbWVUeXBlKi8pIHsgcmV0dXJuIE5PX0VSUk9SOyB9CisgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VXJpKFN0cmluZzggKiAvKnVyaSovKSB7IHJldHVybiBOT19FUlJPUjsgfQorCitwcml2YXRlOgorICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUZXN0TWVkaWFIVFRQQ29ubmVjdGlvbik7Cit9OworCitzdHJ1Y3QgVGVzdE1lZGlhSFRUUFNlcnZpY2UgOiBwdWJsaWMgTWVkaWFIVFRQU2VydmljZSB7CitwdWJsaWM6CisgIFRlc3RNZWRpYUhUVFBTZXJ2aWNlKCkge30KKyAgflRlc3RNZWRpYUhUVFBTZXJ2aWNlKCl7fTsKKworICB2aXJ0dWFsIHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+IG1ha2VIVFRQQ29ubmVjdGlvbigpIHsKKyAgICBtZWRpYUhUVFBDb25uZWN0aW9uID0gc3A8VGVzdE1lZGlhSFRUUENvbm5lY3Rpb24+OjptYWtlKCk7CisgICAgcmV0dXJuIG1lZGlhSFRUUENvbm5lY3Rpb247CisgIH0KKworcHJpdmF0ZToKKyAgc3A8VGVzdE1lZGlhSFRUUENvbm5lY3Rpb24+IG1lZGlhSFRUUENvbm5lY3Rpb24gPSBudWxscHRyOworICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUZXN0TWVkaWFIVFRQU2VydmljZSk7Cit9OworCitjbGFzcyBIdHRwTGl2ZUZ1enplciB7CitwdWJsaWM6CisgIHZvaWQgcHJvY2Vzcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgIHZvaWQgZGVJbml0TGl2ZVNlc3Npb24oKTsKKyAgfkh0dHBMaXZlRnV6emVyKCkgeyBkZUluaXRMaXZlU2Vzc2lvbigpOyB9CisKK3ByaXZhdGU6CisgIHZvaWQgaW52b2tlTGl2ZURhdGFTb3VyY2UoKTsKKyAgdm9pZCBjcmVhdGVNM1U4RmlsZShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgIHZvaWQgaW5pdExpdmVEYXRhU291cmNlKCk7CisgIHZvaWQgaW52b2tlTGl2ZVNlc3Npb24oKTsKKyAgdm9pZCBpbml0TGl2ZVNlc3Npb24oKTsKKyAgdm9pZCBpbnZva2VEZXF1ZXVlQWNjZXNzVW5pdCgpOworICB2b2lkIGludm9rZUNvbm5lY3RBc3luYygpOworICB2b2lkIGludm9rZVNlZWtUbygpOworICB2b2lkIGludm9rZUdldENvbmZpZygpOworICB2b2lkIHNpZ25hbEVvcygpOworICBzdHJpbmcgZ2VuZXJhdGVGaWxlTmFtZSgpOworICBzcDxMaXZlRGF0YVNvdXJjZT4gbUxpdmVEYXRhU291cmNlID0gbnVsbHB0cjsKKyAgc3A8TGl2ZVNlc3Npb24+IG1MaXZlU2Vzc2lvbiA9IG51bGxwdHI7CisgIHNwPEFMb29wZXI+IG1MaXZlTG9vcGVyID0gbnVsbHB0cjsKKyAgc3A8VGVzdE1lZGlhSFRUUFNlcnZpY2U+IGh0dHBTZXJ2aWNlID0gbnVsbHB0cjsKKyAgc3A8VGVzdEFIYW5kbGVyPiBtSGFuZGxlciA9IG51bGxwdHI7CisgIEZ1enplZERhdGFQcm92aWRlciAqbUZEUCA9IG51bGxwdHI7CisgIGJvb2wgbUVvc1JlYWNoZWQgPSBmYWxzZTsKKyAgc3RkOjptdXRleCBtRG93bmxvYWRDb21wbGV0ZU11dGV4OworICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ29uZGl0aW9uYWxWYXJpYWJsZTsKK307CisKK3N0cmluZyBIdHRwTGl2ZUZ1enplcjo6Z2VuZXJhdGVGaWxlTmFtZSgpIHsKKyAgcmV0dXJuIGtGaWxlTmFtZVByZWZpeCArIHRvX3N0cmluZyhnZXRwaWQoKSkgKyBrRmlsZU5hbWVTdWZmaXg7Cit9CisKK3ZvaWQgSHR0cExpdmVGdXp6ZXI6OmNyZWF0ZU0zVThGaWxlKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIG9mc3RyZWFtIG0zdThGaWxlOworICBzdHJpbmcgY3VycmVudEZpbGVOYW1lID0gZ2VuZXJhdGVGaWxlTmFtZSgpOworICBtM3U4RmlsZS5vcGVuKGN1cnJlbnRGaWxlTmFtZSwgaW9zOjpvdXQgfCBpb3M6OmJpbmFyeSk7CisgIG0zdThGaWxlLndyaXRlKChjaGFyICopZGF0YSwgc2l6ZSk7CisgIG0zdThGaWxlLmNsb3NlKCk7Cit9CisKK3ZvaWQgSHR0cExpdmVGdXp6ZXI6OmluaXRMaXZlRGF0YVNvdXJjZSgpIHsKKyAgbUxpdmVEYXRhU291cmNlID0gc3A8TGl2ZURhdGFTb3VyY2U+OjptYWtlKCk7Cit9CisKK3ZvaWQgSHR0cExpdmVGdXp6ZXI6Omludm9rZUxpdmVEYXRhU291cmNlKCkgeworICBpbml0TGl2ZURhdGFTb3VyY2UoKTsKKyAgc2l6ZV90IHNpemUgPSBtRkRQLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oa1JhbmdlTWluLCBrUmFuZ2VNYXgpOworICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihzaXplKTsKKyAgbUxpdmVEYXRhU291cmNlLT5xdWV1ZUJ1ZmZlcihidWZmZXIpOworICB1aW50OF90ICpkYXRhID0gbmV3IHVpbnQ4X3Rbc2l6ZV07CisgIG1MaXZlRGF0YVNvdXJjZS0+cmVhZEF0Tm9uQmxvY2tpbmcoa09mZlNldCwgZGF0YSwgc2l6ZSk7CisgIGludDMyX3QgZmluYWxSZXN1bHQgPSBtRkRQLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlKGtFcnJvck5vTWluLCBrRXJyb3JOb01heCk7CisgIG1MaXZlRGF0YVNvdXJjZS0+cXVldWVFT1MoZmluYWxSZXN1bHQpOworICBtTGl2ZURhdGFTb3VyY2UtPnJlc2V0KCk7CisgIG1MaXZlRGF0YVNvdXJjZS0+Y291bnRRdWV1ZWRCdWZmZXJzKCk7CisgIG1MaXZlRGF0YVNvdXJjZS0+aW5pdENoZWNrKCk7CisgIGRlbGV0ZVtdIGRhdGE7Cit9CisKK3ZvaWQgSHR0cExpdmVGdXp6ZXI6OmluaXRMaXZlU2Vzc2lvbigpIHsKKyAgQUxvb3BlclJvc3RlciBsb29wZXJSb3N0ZXI7CisgIG1IYW5kbGVyID0KKyAgICAgIHNwPFRlc3RBSGFuZGxlcj46Om1ha2Uoc3RkOjpiaW5kKCZIdHRwTGl2ZUZ1enplcjo6c2lnbmFsRW9zLCB0aGlzKSk7CisgIG1MaXZlTG9vcGVyID0gc3A8QUxvb3Blcj46Om1ha2UoKTsKKyAgbUxpdmVMb29wZXItPnNldE5hbWUoImh0dHAgbGl2ZSIpOworICBtTGl2ZUxvb3Blci0+c3RhcnQoKTsKKyAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IHNwPEFNZXNzYWdlPjo6bWFrZSgwLCBtSGFuZGxlcik7CisgIGh0dHBTZXJ2aWNlID0gbmV3IFRlc3RNZWRpYUhUVFBTZXJ2aWNlKCk7CisgIHVpbnQzMl90IGZsYWdzID0gbUZEUC0+Q29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICBtTGl2ZVNlc3Npb24gPSBzcDxMaXZlU2Vzc2lvbj46Om1ha2Uobm90aWZ5LCBmbGFncywgaHR0cFNlcnZpY2UpOworICBtTGl2ZUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1MaXZlU2Vzc2lvbik7CisgIGxvb3BlclJvc3Rlci5yZWdpc3RlckhhbmRsZXIobUxpdmVMb29wZXIsIG1IYW5kbGVyKTsKK30KKwordm9pZCBIdHRwTGl2ZUZ1enplcjo6aW52b2tlRGVxdWV1ZUFjY2Vzc1VuaXQoKSB7CisgIExpdmVTZXNzaW9uOjpTdHJlYW1UeXBlIHN0cmVhbSA9IG1GRFAtPlBpY2tWYWx1ZUluQXJyYXkoa1ZhbGlkU3RyZWFtVHlwZSk7CisgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgbUxpdmVTZXNzaW9uLT5kZXF1ZXVlQWNjZXNzVW5pdChzdHJlYW0sICZidWZmZXIpOworfQorCit2b2lkIEh0dHBMaXZlRnV6emVyOjppbnZva2VTZWVrVG8oKSB7CisgIGludDY0X3QgdGltZVVzID0gbUZEUC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQ2NF90PigwLCBrTWF4VGltZVVzKTsKKyAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlID0KKyAgICAgIG1GRFAtPlBpY2tWYWx1ZUluQXJyYXkoa1ZhbGlkU2Vla01vZGUpOworICBtTGl2ZVNlc3Npb24tPnNlZWtUbyh0aW1lVXMsIG1vZGUpOworfQorCit2b2lkIEh0dHBMaXZlRnV6emVyOjppbnZva2VHZXRDb25maWcoKSB7CisgIG1MaXZlU2Vzc2lvbi0+Z2V0VHJhY2tDb3VudCgpOworICBzaXplX3QgdHJhY2tJbmRleCA9IG1GRFAtPkNvbnN1bWVJbnRlZ3JhbDxzaXplX3Q+KCk7CisgIG1MaXZlU2Vzc2lvbi0+Z2V0VHJhY2tJbmZvKHRyYWNrSW5kZXgpOworICBtZWRpYV90cmFja190eXBlIHR5cGUgPSBtRkRQLT5QaWNrVmFsdWVJbkFycmF5KGtWYWxpZE1lZGlhVHJhY2tUeXBlKTsKKyAgbUxpdmVTZXNzaW9uLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOworICBzcDxNZXRhRGF0YT4gbWV0YTsKKyAgTGl2ZVNlc3Npb246OlN0cmVhbVR5cGUgc3RyZWFtID0gbUZEUC0+UGlja1ZhbHVlSW5BcnJheShrVmFsaWRTdHJlYW1UeXBlKTsKKyAgbUxpdmVTZXNzaW9uLT5nZXRTdHJlYW1Gb3JtYXRNZXRhKHN0cmVhbSwgJm1ldGEpOworICBtTGl2ZVNlc3Npb24tPmdldEtleUZvclN0cmVhbShzdHJlYW0pOworICBpZiAoc3RyZWFtICE9IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1NVQlRJVExFUykgeworICAgIG1MaXZlU2Vzc2lvbi0+Z2V0U291cmNlVHlwZUZvclN0cmVhbShzdHJlYW0pOworICB9Cit9CisKK3ZvaWQgSHR0cExpdmVGdXp6ZXI6Omludm9rZUNvbm5lY3RBc3luYygpIHsKKyAgc3RyaW5nIGN1cnJlbnRGaWxlTmFtZSA9IGdlbmVyYXRlRmlsZU5hbWUoKTsKKyAgc3RyaW5nIHVybCA9IGtGaWxlVXJsUHJlZml4ICsgY3VycmVudEZpbGVOYW1lOworICBzdHJpbmcgc3RyXzEgPSBtRkRQLT5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtSYW5kb21TdHJpbmdMZW5ndGgpOworICBzdHJpbmcgc3RyXzIgPSBtRkRQLT5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtSYW5kb21TdHJpbmdMZW5ndGgpOworCisgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGhlYWRlcnM7CisgIGhlYWRlcnMuYWRkKFN0cmluZzgoc3RyXzEuY19zdHIoKSksIFN0cmluZzgoc3RyXzIuY19zdHIoKSkpOworICBtTGl2ZVNlc3Npb24tPmNvbm5lY3RBc3luYyh1cmwuY19zdHIoKSwgJmhlYWRlcnMpOworfQorCit2b2lkIEh0dHBMaXZlRnV6emVyOjppbnZva2VMaXZlU2Vzc2lvbigpIHsKKyAgaW5pdExpdmVTZXNzaW9uKCk7CisgIEJ1ZmZlcmluZ1NldHRpbmdzIGJ1ZmZlcmluZ1NldHRpbmdzOworICBidWZmZXJpbmdTZXR0aW5ncy5tSW5pdGlhbE1hcmtNcyA9IGtQcmVwYXJlTWFya01zOworICBidWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMgPSBrUmVhZHlNYXJrTXM7CisgIG1MaXZlU2Vzc2lvbi0+c2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nU2V0dGluZ3MpOworICBpbnZva2VDb25uZWN0QXN5bmMoKTsKKyAgc3RkOjp1bmlxdWVfbG9jayB3YWl0Rm9yRG93bmxvYWRDb21wbGV0ZShtRG93bmxvYWRDb21wbGV0ZU11dGV4KTsKKyAgbUNvbmRpdGlvbmFsVmFyaWFibGUud2FpdCh3YWl0Rm9yRG93bmxvYWRDb21wbGV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhpc10geyByZXR1cm4gbUVvc1JlYWNoZWQ7IH0pOworICBpZiAobUxpdmVTZXNzaW9uLT5pc1NlZWthYmxlKCkpIHsKKyAgICBpbnZva2VTZWVrVG8oKTsKKyAgfQorICBpbnZva2VEZXF1ZXVlQWNjZXNzVW5pdCgpOworICBzaXplX3QgaW5kZXggPSBtRkRQLT5Db25zdW1lSW50ZWdyYWw8c2l6ZV90PigpOworICBib29sIHNlbGVjdCA9IG1GRFAtPkNvbnN1bWVCb29sKCk7CisgIG1MaXZlU2Vzc2lvbi0+c2VsZWN0VHJhY2soaW5kZXgsIHNlbGVjdCk7CisgIG1MaXZlU2Vzc2lvbi0+aGFzRHluYW1pY0R1cmF0aW9uKCk7CisgIGludDY0X3QgZmlyc3RUaW1lVXMgPQorICAgICAgbUZEUC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQ2NF90PihrUmFuZ2VNaW4sIGtSYW5nZU1heCk7CisgIGludDY0X3QgdGltZVVzID0gbUZEUC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQ2NF90PihrUmFuZ2VNaW4sIGtSYW5nZU1heCk7CisgIGludDMyX3QgZGlzY29udGludWl0eVNlcSA9IG1GRFAtPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICBtTGl2ZVNlc3Npb24tPmNhbGN1bGF0ZU1lZGlhVGltZVVzKGZpcnN0VGltZVVzLCB0aW1lVXMsIGRpc2NvbnRpbnVpdHlTZXEpOworICBpbnZva2VHZXRDb25maWcoKTsKK30KKwordm9pZCBIdHRwTGl2ZUZ1enplcjo6cHJvY2Vzcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBtRkRQID0gbmV3IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKyAgY3JlYXRlTTNVOEZpbGUoZGF0YSwgc2l6ZSk7CisgIGludm9rZUxpdmVEYXRhU291cmNlKCk7CisgIGludm9rZUxpdmVTZXNzaW9uKCk7CisgIGRlbGV0ZSBtRkRQOworfQorCit2b2lkIEh0dHBMaXZlRnV6emVyOjpkZUluaXRMaXZlU2Vzc2lvbigpIHsKKyAgaWYgKG1MaXZlU2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgbUxpdmVTZXNzaW9uLT5kaXNjb25uZWN0KCk7CisgICAgbUxpdmVMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1MaXZlU2Vzc2lvbi0+aWQoKSk7CisgICAgbUxpdmVMb29wZXItPnN0b3AoKTsKKyAgfQorICBtTGl2ZVNlc3Npb24uY2xlYXIoKTsKKyAgbUxpdmVMb29wZXIuY2xlYXIoKTsKK30KKwordm9pZCBIdHRwTGl2ZUZ1enplcjo6c2lnbmFsRW9zKCkgeworICBtRW9zUmVhY2hlZCA9IHRydWU7CisgIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gd2FpdEZvckRvd25sb2FkQ29tcGxldGUobURvd25sb2FkQ29tcGxldGVNdXRleCk7CisgIH0KKyAgbUNvbmRpdGlvbmFsVmFyaWFibGUubm90aWZ5X29uZSgpOworICByZXR1cm47Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgSHR0cExpdmVGdXp6ZXIgaHR0cGxpdmVGdXp6ZXI7CisgIGh0dHBsaXZlRnV6emVyLnByb2Nlc3MoZGF0YSwgc2l6ZSk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2h0dHBsaXZlX2Z1enplci5kaWN0IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2h0dHBsaXZlX2Z1enplci5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwM2NjN2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvaHR0cGxpdmVfZnV6emVyLmRpY3QKQEAgLTAsMCArMSwxNSBAQAorI20zdTgtVGFncwora3cxPSIjRVhUTTNVIgora3cyPSIjRVhULVgtVkVSU0lPTjoiCitrdzM9IiNFWFQtWC1UQVJHRVREVVJBVElPTjoiCitrdzQ9IiNFWFQtWC1QTEFZTElTVC1UWVBFOiIKK2t3NT0iI0VYVElORjoiCitrdzY9IiNFWFQtWC1FTkRMSVNUIgora3c3PSIjRVhULVgtTUVESUEtU0VRVUVOQ0U6Igora3c4PSIjRVhULVgtS0VZOk1FVEhPRD1OT05FIgora3c5PSIjRVhULVgtRElTQ09OVElOVUlUWToiCitrdzEwPSIjRVhULVgtRElTQ09OVElOVUlUWS1TRVFVRU5DRTowIgora3cxMT0iI0VYVC1YLVNUUkVBTS1JTkY6QkFORFdJRFRIPSIKK2t3MTI9IiNFWFQtWC1TVFJFQU0tSU5GOkNPREVDUz0iCitrdzEzPSIjRVhULVgtQllURVJBTkdFOiIKK2t3MTQ9IiNFWFQtWC1NRURJQSIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCmluZGV4IGM4NGNjMTAuLjYzMmIzMmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaApAQCAtNzEsNiArNzEsOSBAQAogICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVNldElucHV0U3VyZmFjZShjb25zdCBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gJnN1cmZhY2UpOwogICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVN0YXJ0KCk7CiAgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU2h1dGRvd24oYm9vbCBrZWVwQ29tcG9uZW50QWxsb2NhdGVkID0gZmFsc2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbWV0ZXJzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAqbmFtZXMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3Vic2NyaWJlVG9QYXJhbWV0ZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmbmFtZXMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5zdWJzY3JpYmVGcm9tUGFyYW1ldGVycyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm5hbWVzKSBvdmVycmlkZTsKIAogICAgIHN0YXR1c190IHF1ZXJ5Q2FwYWJpbGl0aWVzKAogICAgICAgICAgICAgY29uc3QgY2hhciogb3duZXIsIGNvbnN0IGNoYXIqIG5hbWUsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKaW5kZXggMmMwM2YyNy4uZjA3MGFhYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaApAQCAtMTA1LDcgKzEwNSw2IEBACiAgICAgICAgIGlmIChtTWVtb3J5LmdldCgpID09IG51bGxwdHIgfHwgbU1lbW9yeS0+dW5zZWN1cmVQb2ludGVyKCkgPT0gbnVsbHB0cikgcmV0dXJuIDA7CiAgICAgICAgIGludDMyX3QgcmVtb3RlUmVmY291bnQgPQogICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT51bnNlY3VyZVBvaW50ZXIoKSktPmdldFJlbW90ZVJlZmNvdW50KCk7Ci0gICAgICAgIC8vIFNhbml0eSBjaGVjayBzbyB0aGF0IHJlbW90ZVJlZkNvdW50KCkgaXMgbm9uLW5lZ2F0aXZlLgogICAgICAgICByZXR1cm4gcmVtb3RlUmVmY291bnQgPj0gMCA/IHJlbW90ZVJlZmNvdW50IDogMDsgLy8gZG8gbm90IGFsbG93IGNvcnJ1cHRlZCBkYXRhLgogI2Vsc2UKICAgICAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCmluZGV4IDQyMzdlOGMuLjNhMDE5MjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCkBAIC0zNjQsNyArMzY0LDcgQEAKIGlubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfQVYxUHJvZmlsZShpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKICAgICBzd2l0Y2ggKGkpIHsKICAgICAgICAgY2FzZSBBVjFQcm9maWxlTWFpbjg6ICAgICAgICAgICByZXR1cm4gIk1haW44IjsKLSAgICAgICAgY2FzZSBBVjFQcm9maWxlTWFpbjEwOiAgICAgICAgICByZXR1cm4gIk1haW4xMEhEUiI7CisgICAgICAgIGNhc2UgQVYxUHJvZmlsZU1haW4xMDogICAgICAgICAgcmV0dXJuICJNYWluMTAiOwogICAgICAgICBjYXNlIEFWMVByb2ZpbGVNYWluMTBIRFIxMDogICAgIHJldHVybiAiTWFpbjEwSERSMTAiOwogICAgICAgICBjYXNlIEFWMVByb2ZpbGVNYWluMTBIRFIxMFBsdXM6IHJldHVybiAiTWFpbjEwSERSUGx1cyI7CiAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvQW5kcm9pZC5icAppbmRleCAwMDk3ODMwLi5lYTE3YTRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9BbmRyb2lkLmJwCkBAIC04Niw5ICs4Niw2IEBACiAgICAgZGljdGlvbmFyeTogImRpY3Rpb25hcmllcy9mb3JtYXRzLmRpY3QiLAogICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X2Z1enplcl9kZWZhdWx0cyJdLAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF93ZWJtIiwKICAgICAgICAgImxpYmRhdGFzb3VyY2UiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCi0gICAgICAgICJsaWJvZ2ciLAogICAgIF0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvT1dORVJTIGIvbWVkaWEvbXRwL09XTkVSUwppbmRleCAxOTI4YmE4Li41NGQzZDRhIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvT1dORVJTCisrKyBiL21lZGlhL210cC9PV05FUlMKQEAgLTEsNiArMSw1IEBACiBzZXQgbm9wYXJlbnQKIAotbWFyY29uZUBnb29nbGUuY29tCiBqc2hhcmtleUBhbmRyb2lkLmNvbQogamFtZXN3ZWlAZ29vZ2xlLmNvbQogcm1vanVtZGVyQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcAppbmRleCAxYWUyYjQ0Li4wZTJkZTRlIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwCkBAIC00NTIsMTcgKzQ1MiwxOSBAQAogICAgICAgICB1aW50MzJfdCBmbGFncykgewogICAgIHNwPEFNZXNzYWdlPiBuYXRpdmVGb3JtYXQ7CiAgICAgQU1lZGlhRm9ybWF0X2dldEZvcm1hdChmb3JtYXQsICZuYXRpdmVGb3JtYXQpOwotICAgIEFMT0dWKCJjb25maWd1cmUgd2l0aCBmb3JtYXQ6ICVzIiwgbmF0aXZlRm9ybWF0LT5kZWJ1Z1N0cmluZygwKS5jX3N0cigpKTsKKyAgICAvLyBjcmVhdGUgb3VyIHNoYWxsb3cgY29weSwgc28gd2UgYXJlbid0IHZpY3RpbSB0byBhbnkgbGF0ZXIgY2hhbmdlcy4KKyAgICBzcDxBTWVzc2FnZT4gZHVwTmF0aXZlRm9ybWF0ID0gbmF0aXZlRm9ybWF0LT5kdXAoKTsKKyAgICBBTE9HVigiY29uZmlndXJlIHdpdGggZm9ybWF0OiAlcyIsIGR1cE5hdGl2ZUZvcm1hdC0+ZGVidWdTdHJpbmcoMCkuY19zdHIoKSk7CiAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IE5VTEw7CiAgICAgaWYgKHdpbmRvdyAhPSBOVUxMKSB7CiAgICAgICAgIHN1cmZhY2UgPSAoU3VyZmFjZSopIHdpbmRvdzsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBtRGF0YS0+bUNvZGVjLT5jb25maWd1cmUobmF0aXZlRm9ybWF0LCBzdXJmYWNlLAorICAgIHN0YXR1c190IGVyciA9IG1EYXRhLT5tQ29kZWMtPmNvbmZpZ3VyZShkdXBOYXRpdmVGb3JtYXQsIHN1cmZhY2UsCiAgICAgICAgICAgICBjcnlwdG8gPyBjcnlwdG8tPm1DcnlwdG8gOiBOVUxMLCBmbGFncyk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBBTE9HRSgiY29uZmlndXJlOiBlcnIoJWQpLCBmYWlsZWQgd2l0aCBmb3JtYXQ6ICVzIiwKLSAgICAgICAgICAgICAgZXJyLCBuYXRpdmVGb3JtYXQtPmRlYnVnU3RyaW5nKDApLmNfc3RyKCkpOworICAgICAgICAgICAgICBlcnIsIGR1cE5hdGl2ZUZvcm1hdC0+ZGVidWdTdHJpbmcoMCkuY19zdHIoKSk7CiAgICAgfQogICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXJyKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL25kay9PV05FUlMgYi9tZWRpYS9uZGsvT1dORVJTCmluZGV4IDlkYzQ0MWUuLjgzNjQ0ZjAgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9PV05FUlMKKysrIGIvbWVkaWEvbmRrL09XTkVSUwpAQCAtMSwzICsxLDQgQEAKLW1hcmNvbmVAZ29vZ2xlLmNvbQorZXNzaWNrQGdvb2dsZS5jb20KK2xham9zQGdvb2dsZS5jb20KICMgRm9yIEFJbWFnZS9BSW1hZ2VSZWFkZXIKIGluY2x1ZGUgcGxhdGZvcm0vZnJhbWV3b3Jrcy9hdjovY2FtZXJhL09XTkVSUwpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGIxNzU0MWQuLjc1ZDczYmYgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTMwLDcgKzMwLDggQEAKICAgICAgICAgYW5kcm9pZDpyb3VuZEljb249IkBtaXBtYXAvaWNfbGF1bmNoZXJfcm91bmQiCiAgICAgICAgIGFuZHJvaWQ6c3VwcG9ydHNSdGw9InRydWUiCiAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9BcHBUaGVtZSI+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLm1lZGlhLnNhbXBsZXZpZGVvZW5jb2Rlci5NYWluQWN0aXZpdHkiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5tZWRpYS5zYW1wbGV2aWRlb2VuY29kZXIuTWFpbkFjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CkBAIC00Miw0ICs0Myw0IEBACiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJTYW1wbGVWaWRlb0VuY29kZXIgVGVzdCIvPgogCi08L21hbmlmZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L0FuZHJvaWQuYnAKaW5kZXggMmUwNmRhNS4uNGI0NGRjZiAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3QvQW5kcm9pZC5icApAQCAtNjksNyArNjksNiBAQAogamF2YV9kZWZhdWx0cyB7CiAgICAgbmFtZTogIk1lZGlhQmVuY2htYXJrLWRlZmF1bHRzIiwKIAotICAgIHNka192ZXJzaW9uOiAic3lzdGVtX2N1cnJlbnQiLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI4IiwKLSAgICB0YXJnZXRfc2RrX3ZlcnNpb246ICIyOSIsCisgICAgdGFyZ2V0X3Nka192ZXJzaW9uOiAiMzAiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9idWlsZC5ncmFkbGUgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L2J1aWxkLmdyYWRsZQppbmRleCBiMmFlZTFhLi5iMjIyZDQ3IDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L2J1aWxkLmdyYWRsZQorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L2J1aWxkLmdyYWRsZQpAQCAtMTcsMjEgKzE3LDIxIEBACiBidWlsZHNjcmlwdCB7CiAgICAgcmVwb3NpdG9yaWVzIHsKICAgICAgICAgZ29vZ2xlKCkKLSAgICAgICAgamNlbnRlcigpCisgICAgICAgIG1hdmVuQ2VudHJhbCgpCiAgICAgfQogICAgIGRlcGVuZGVuY2llcyB7Ci0gICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjMuNS4wJworICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTo0LjIuMScKICAgICB9CiB9CiAKIGFwcGx5IHBsdWdpbjogJ2NvbS5hbmRyb2lkLmFwcGxpY2F0aW9uJwogCiBhbmRyb2lkIHsKLSAgICBjb21waWxlU2RrVmVyc2lvbiAyOQorICAgIGNvbXBpbGVTZGtWZXJzaW9uIDMwCiAgICAgZGVmYXVsdENvbmZpZyB7CiAgICAgICAgIGFwcGxpY2F0aW9uSWQgImNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyayIKICAgICAgICAgbWluU2RrVmVyc2lvbiAyOAotICAgICAgICB0YXJnZXRTZGtWZXJzaW9uIDI5CisgICAgICAgIHRhcmdldFNka1ZlcnNpb24gMzAKICAgICAgICAgdmVyc2lvbkNvZGUgMQogICAgICAgICB2ZXJzaW9uTmFtZSAiMS4wIgogICAgICAgICB0ZXN0SW5zdHJ1bWVudGF0aW9uUnVubmVyICJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCkBAIC01NywyMCArNTcsMjAgQEAKICAgICBleHRlcm5hbE5hdGl2ZUJ1aWxkIHsKICAgICAgICAgY21ha2UgewogICAgICAgICAgICAgcGF0aCAic3JjL21haW4vY3BwL0NNYWtlTGlzdHMudHh0IgotICAgICAgICAgICAgdmVyc2lvbiAiMy4xMC4yIgorICAgICAgICAgICAgdmVyc2lvbiAiMy4xOC4xIgogICAgICAgICB9CiAgICAgfQogfQogCiByZXBvc2l0b3JpZXMgewogICAgIGdvb2dsZSgpCi0gICAgamNlbnRlcigpCisgICAgbWF2ZW5DZW50cmFsKCkKIH0KIAogZGVwZW5kZW5jaWVzIHsKICAgICBpbXBsZW1lbnRhdGlvbiBmaWxlVHJlZShkaXI6ICdsaWJzJywgaW5jbHVkZTogWycqLmphciddKQotICAgIGltcGxlbWVudGF0aW9uICdhbmRyb2lkeC5hcHBjb21wYXQ6YXBwY29tcGF0OjEuMS4wJwotICAgIHRlc3RJbXBsZW1lbnRhdGlvbiAnanVuaXQ6anVuaXQ6NC4xMicKLSAgICBhbmRyb2lkVGVzdEltcGxlbWVudGF0aW9uICdhbmRyb2lkeC50ZXN0OnJ1bm5lcjoxLjIuMCcKLSAgICBhbmRyb2lkVGVzdEltcGxlbWVudGF0aW9uICdhbmRyb2lkeC50ZXN0LmV4dDpqdW5pdDoxLjEuMScKKyAgICBpbXBsZW1lbnRhdGlvbiAnYW5kcm9pZHguYXBwY29tcGF0OmFwcGNvbXBhdDoxLjMuMCcKKyAgICB0ZXN0SW1wbGVtZW50YXRpb24gJ2p1bml0Omp1bml0OjQuMTMuMicKKyAgICBhbmRyb2lkVGVzdEltcGxlbWVudGF0aW9uICdhbmRyb2lkeC50ZXN0OnJ1bm5lcjoxLjMuMCcKKyAgICBhbmRyb2lkVGVzdEltcGxlbWVudGF0aW9uICdhbmRyb2lkeC50ZXN0LmV4dDpqdW5pdDoxLjEuMicKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2NwcC9BbmRyb2lkLmJwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9jcHAvQW5kcm9pZC5icAppbmRleCBhZjkyNDI0Li4wMTkyZDY4IDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2NwcC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL0FuZHJvaWQuYnAKQEAgLTksNyArOSw2IEBACiAKIGNjX3Rlc3RfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYm1lZGlhYmVuY2htYXJrX2puaSIsCi0gICAgc2RrX3ZlcnNpb246ICJjdXJyZW50IiwKIAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJtZWRpYWJlbmNobWFya19jb21tb24tZGVmYXVsdHMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvY29tbW9uL0FuZHJvaWQuYnAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9jb21tb24vQW5kcm9pZC5icAppbmRleCA2YjU0YzZhLi43MThkMjE3IDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9jb21tb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9jb21tb24vQW5kcm9pZC5icApAQCAtNTUsNyArNTUsNiBAQAogCiBjY19kZWZhdWx0cyB7CiAgICAgbmFtZTogImxpYm1lZGlhYmVuY2htYXJrLWRlZmF1bHRzIiwKLSAgICBzZGtfdmVyc2lvbjogImN1cnJlbnQiLAogICAgIHN0bDogImMrK19zaGFyZWQiLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2V4dHJhY3Rvci9FeHRyYWN0b3IuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZXh0cmFjdG9yL0V4dHJhY3Rvci5jcHAKaW5kZXggZjBiYjNiOS4uM2JkZmJhZCAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZXh0cmFjdG9yL0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZXh0cmFjdG9yL0V4dHJhY3Rvci5jcHAKQEAgLTEyNCw5ICsxMjQsNyBAQAogCiAgICAgaW50NjRfdCBzVGltZSA9IG1TdGF0cy0+Z2V0Q3VyVGltZSgpOwogICAgIGlmIChtRXh0cmFjdG9yKSB7Ci0gICAgICAgIC8vIFRPRE86IChiLzE0MDEyODUwNSkgTXVsdGlwbGUgY2FsbHMgcmVzdWx0IGluIERvUy4KLSAgICAgICAgLy8gVW5jb21tZW50IGNhbGwgdG8gQU1lZGlhRXh0cmFjdG9yX2RlbGV0ZSgpIG9uY2UgdGhpcyBpcyByZXNvbHZlZAotICAgICAgICAvLyBBTWVkaWFFeHRyYWN0b3JfZGVsZXRlKG1FeHRyYWN0b3IpOworICAgICAgICBBTWVkaWFFeHRyYWN0b3JfZGVsZXRlKG1FeHRyYWN0b3IpOwogICAgICAgICBtRXh0cmFjdG9yID0gbnVsbHB0cjsKICAgICB9CiAgICAgaW50NjRfdCBlVGltZSA9IG1TdGF0cy0+Z2V0Q3VyVGltZSgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQW5kcm9pZC5icAppbmRleCAwZmJkMjBkLi45YThjYWEzIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQW5kcm9pZC5icApAQCAtMzMsNyArMzMsMTIgQEAKIAogICAgIHNyY3M6IFsiRXh0cmFjdG9yVGVzdC5jcHAiXSwKIAotICAgIHN0YXRpY19saWJzOiBbImxpYm1lZGlhYmVuY2htYXJrX2V4dHJhY3RvciJdCisgICAgc3RhdGljX2xpYnM6IFsibGlibWVkaWFiZW5jaG1hcmtfZXh0cmFjdG9yIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKKyAgICBdLAogfQogCiBjY190ZXN0IHsKQEAgLTUwLDYgKzU1LDExIEBACiAgICAgICAgICJsaWJtZWRpYWJlbmNobWFya19leHRyYWN0b3IiLAogICAgICAgICAibGlibWVkaWFiZW5jaG1hcmtfZGVjb2RlciIsCiAgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmJpbmRlcl9uZGsiLAorICAgIF0sCiB9CiAKIGNjX3Rlc3QgewpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0RlY29kZXJUZXN0LmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9EZWNvZGVyVGVzdC5jcHAKaW5kZXggODFlZjAyYS4uMzY2NjcyNCAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0RlY29kZXJUZXN0LmNwcAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRGVjb2RlclRlc3QuY3BwCkBAIC0yMSw2ICsyMSw4IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8bGltaXRzPgogCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcHJvY2Vzcy5oPgorCiAjaW5jbHVkZSAiQmVuY2htYXJrVGVzdEVudmlyb25tZW50LmgiCiAjaW5jbHVkZSAiRGVjb2Rlci5oIgogCkBAIC0xNzUsNiArMTc3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImMyLmFuZHJvaWQuaGV2Yy5kZWNvZGVyIiwgdHJ1ZSkpKTsKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgQUJpbmRlclByb2Nlc3Nfc3RhcnRUaHJlYWRQb29sKCk7CiAgICAgZ0VudiA9IG5ldyBCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQoKTsKICAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKICAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9FeHRyYWN0b3JUZXN0LmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9FeHRyYWN0b3JUZXN0LmNwcAppbmRleCBkMTRkMTViLi4yN2VlOWJhIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRXh0cmFjdG9yVGVzdC5jcHAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0V4dHJhY3RvclRlc3QuY3BwCkBAIC0xOSw2ICsxOSw4IEBACiAKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcHJvY2Vzcy5oPgorCiAjaW5jbHVkZSAiQmVuY2htYXJrVGVzdEVudmlyb25tZW50LmgiCiAjaW5jbHVkZSAiRXh0cmFjdG9yLmgiCiAKQEAgLTczLDYgKzc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpKTsKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgQUJpbmRlclByb2Nlc3Nfc3RhcnRUaHJlYWRQb29sKCk7CiAgICAgZ0VudiA9IG5ldyBCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQoKTsKICAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKICAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL0FuZHJvaWQuYnAgYi9tZWRpYS91dGlscy9BbmRyb2lkLmJwCmluZGV4IGJmZTczZDUuLmUzYjgzN2UgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvdXRpbHMvQW5kcm9pZC5icApAQCAtNTEsNiArNTEsNyBAQAogICAgICAgICAibGlicGVybWlzc2lvbiIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKKyAgICAgICAgInBhY2thZ2VtYW5hZ2VyX2FpZGwtY3BwIiwKICAgICBdLAogICAgIGV4cG9ydF9zdGF0aWNfbGliX2hlYWRlcnM6IFsKICAgICAgICAgImxpYmJhdHRlcnlzdGF0c19haWRsIiwKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL1NlcnZpY2VVdGlsaXRpZXMuY3BwIGIvbWVkaWEvdXRpbHMvU2VydmljZVV0aWxpdGllcy5jcHAKaW5kZXggOWM3Yjg2My4uNDJmNDhhNSAxMDA2NDQKLS0tIGEvbWVkaWEvdXRpbHMvU2VydmljZVV0aWxpdGllcy5jcHAKKysrIGIvbWVkaWEvdXRpbHMvU2VydmljZVV0aWxpdGllcy5jcHAKQEAgLTEwMSw3ICsxMDEsMTEgQEAKICAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIG15QXR0cmlidXRpb25Tb3VyY2U7CiAgICAgbXlBdHRyaWJ1dGlvblNvdXJjZS51aWQgPSBWQUxVRV9PUl9GQVRBTChhbmRyb2lkOjpsZWdhY3kyYWlkbF91aWRfdF9pbnQzMl90KGdldHVpZCgpKSk7CiAgICAgbXlBdHRyaWJ1dGlvblNvdXJjZS5waWQgPSBWQUxVRV9PUl9GQVRBTChhbmRyb2lkOjpsZWdhY3kyYWlkbF9waWRfdF9pbnQzMl90KGdldHBpZCgpKSk7Ci0gICAgbXlBdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IHNwPEJCaW5kZXI+OjptYWtlKCk7CisgICAgaWYgKGNhbGxlckF0dHJpYnV0aW9uU291cmNlLnRva2VuICE9IG51bGxwdHIpIHsKKyAgICAgICAgbXlBdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IGNhbGxlckF0dHJpYnV0aW9uU291cmNlLnRva2VuOworICAgIH0gZWxzZSB7CisgICAgICAgIG15QXR0cmlidXRpb25Tb3VyY2UudG9rZW4gPSBzcDxCQmluZGVyPjo6bWFrZSgpOworICAgIH0KICAgICBteUF0dHJpYnV0aW9uU291cmNlLm5leHQucHVzaF9iYWNrKG5leHRBdHRyaWJ1dGlvblNvdXJjZSk7CiAKICAgICByZXR1cm4gc3RkOjpvcHRpb25hbDxBdHRyaWJ1dGlvblNvdXJjZVN0YXRlPntteUF0dHJpYnV0aW9uU291cmNlfTsKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2Z1enplcnMvQW5kcm9pZC5icCBiL21lZGlhL3V0aWxzL2Z1enplcnMvQW5kcm9pZC5icAppbmRleCBjMTY5OGRjLi5jNGRjMjRmIDEwMDY0NAotLS0gYS9tZWRpYS91dGlscy9mdXp6ZXJzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvdXRpbHMvZnV6emVycy9BbmRyb2lkLmJwCkBAIC0xOCw2ICsxOCw3IEBACiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAorICAgICAgICAicGFja2FnZW1hbmFnZXJfYWlkbC1jcHAiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL09XTkVSUyBiL3NlcnZpY2VzL09XTkVSUwppbmRleCBmMGI1ZTJmLi4xN2U2MDVkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9PV05FUlMKKysrIGIvc2VydmljZXMvT1dORVJTCkBAIC0xLDkgKzEsNiBAQAotY2h6QGdvb2dsZS5jb20KIGVsYXVyZW50QGdvb2dsZS5jb20KIGVzc2lja0Bnb29nbGUuY29tCiBldGFsdmFsYUBnb29nbGUuY29tCi1na2FzdGVuQGdvb2dsZS5jb20KIGh1bmdhQGdvb2dsZS5jb20KLW1hcmNvbmVAZ29vZ2xlLmNvbQogbmNoYWxrb0Bnb29nbGUuY29tCiBxdXhpYW5nZmFuZ0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLmJwCmluZGV4IGI5MWYzMDIuLmZlY2MxODMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLmJwCkBAIC04MSw2ICs4MSw3IEBACiAgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAogICAgICAgICAibGlic2htZW1jb21wYXQiLAogICAgICAgICAibGlidmlicmF0b3IiLAorICAgICAgICAicGFja2FnZW1hbmFnZXJfYWlkbC1jcHAiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAppbmRleCA2NWExNjNmLi42Y2RiM2NkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcApAQCAtOTk3LDggKzk5Nyw5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgc2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uX2wodGhyZWFkLCBzZXNzaW9uSWQpOworICAgICAgICBpZiAoKG91dHB1dC5mbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpID09IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpIHsKKyAgICAgICAgICAgIHNldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbl9sKHRocmVhZCwgc2Vzc2lvbklkKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKaW5kZXggYTM4MWM3ZC4uYjgyNjAxYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcApAQCAtNTczLDYgKzU3MywxMiBAQAogCiAgICAgLy8gY3JlYXRlIGEgc3BlY2lhbCBwbGF5YmFjayB0cmFjayB0byByZW5kZXIgdG8gcGxheWJhY2sgdGhyZWFkLgogICAgIC8vIHRoaXMgdHJhY2sgaXMgZ2l2ZW4gdGhlIHNhbWUgYnVmZmVyIGFzIHRoZSBQYXRjaFJlY29yZCBidWZmZXIKKworICAgIC8vIERlZmF1bHQgYmVoYXZpb3VyIGlzIHRvIHN0YXJ0IGFzIHNvb24gYXMgcG9zc2libGUgdG8gaGF2ZSB0aGUgbG93ZXN0IHBvc3NpYmxlIGxhdGVuY3kgZXZlbiBpZgorICAgIC8vIGl0IG1pZ2h0IGdsaXRjaC4KKyAgICAvLyBEaXNhYmxlIHRoaXMgYmVoYXZpb3IgZm9yIEZNIFR1bmVyIHNvdXJjZSBpZiBubyBmYXN0IGNhcHR1cmUvbWl4ZXIgYXZhaWxhYmxlLgorICAgIGNvbnN0IGJvb2wgaXNGbUJyaWRnZSA9IG1BdWRpb1BhdGNoLnNvdXJjZXNbMF0uZXh0LmRldmljZS50eXBlID09IEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUjsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudFRvQmVSZWFkeSA9IGlzRm1CcmlkZ2UgJiYgIXVzZVBhc3N0aHJ1UGF0Y2hSZWNvcmQgPyBmcmFtZUNvdW50IC8gNCA6IDE7CiAgICAgc3A8UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s+IHRlbXBQYXRjaFRyYWNrID0gbmV3IFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5YmFjay50aHJlYWQoKS5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLApAQCAtNTgyLDcgKzU4OCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wUmVjb3JkVHJhY2stPmJ1ZmZlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBSZWNvcmRUcmFjay0+YnVmZmVyU2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSAvKnRpbWVvdXQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50VG9CZVJlYWR5KTsKICAgICBzdGF0dXMgPSBtUGxheWJhY2suY2hlY2tUcmFjayh0ZW1wUGF0Y2hUcmFjay5nZXQoKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAppbmRleCAwOTI5MDU1Li4wNGIxYzZkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaApAQCAtMTgzLDYgKzE4MywxMiBAQAogICAgICAgIH0KICAgICB9CiAKKyAgICBzdGF0aWMgYm9vbCBjaGVja1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKSB7CisgICAgICAgIHJldHVybiBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkKKyAgICAgICAgICAgICAgICAmJiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKSA9PSAwOworICAgIH0KKwogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGdldE91dHB1dEZsYWdzKCkgY29uc3QgeyByZXR1cm4gbUZsYWdzOyB9CiAgICAgZmxvYXQgZ2V0U3BlZWQoKSBjb25zdCB7IHJldHVybiBtU3BlZWQ7IH0KIHByb3RlY3RlZDoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKaW5kZXggZTBjNWZhNS4uMjMzODY1ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKQEAgLTcxMyw4ICs3MTMsNyBAQAogICAgICAgICB0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbE1hc2sgJj0gfigxIDw8IGkpOwogICAgIH0KIAotICAgIG1TZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkID0gdGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6TUlYRVIKLSAgICAgICAgICAgIHx8IHRocmVhZC0+dHlwZSgpID09IFRocmVhZEJhc2U6OkRVUExJQ0FUSU5HOworICAgIG1TZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkID0gY2hlY2tTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKGZvcm1hdCwgZmxhZ3MpOwogI2lmZGVmIFRFRV9TSU5LCiAgICAgbVRlZS5zZXRJZChzdGQ6OnN0cmluZygiXyIpICsgc3RkOjp0b19zdHJpbmcobVRocmVhZElvSGFuZGxlKQogICAgICAgICAgICAgKyAiXyIgKyBzdGQ6OnRvX3N0cmluZyhtSWQpICsgIl9UIik7CkBAIC0xNDA1LDYgKzE0MDQsNjAgQEAKICAgICAgICAgICAgIC5jb250ZW50X3R5cGUgPSBtQXR0ci5jb250ZW50X3R5cGUsCiAgICAgICAgICAgICAuZ2FpbiA9IG1GaW5hbFZvbHVtZSwKICAgICB9OworCisgICAgLy8gV2hlbiBhdHRyaWJ1dGVzIGFyZSB1bmRlZmluZWQsIGRlcml2ZSBkZWZhdWx0IHZhbHVlcyBmcm9tIHN0cmVhbSB0eXBlLgorICAgIC8vIFNlZSBBdWRpb0F0dHJpYnV0ZXMuamF2YSwgdXNhZ2VGb3JTdHJlYW1UeXBlKCkgYW5kIEJ1aWxkZXIuc2V0SW50ZXJuYWxMZWdhY3lTdHJlYW1UeXBlKCkKKyAgICBpZiAobUF0dHIudXNhZ2UgPT0gQVVESU9fVVNBR0VfVU5LTk9XTikgeworICAgICAgICBzd2l0Y2ggKG1TdHJlYW1UeXBlKSB7CisgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw6CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLnVzYWdlID0gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjsKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9TWVNURU06CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLnVzYWdlID0gQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT047CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fUklORzoKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UudXNhZ2UgPSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOworICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgorICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS51c2FnZSA9IEFVRElPX1VTQUdFX01FRElBOworICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfTVVTSUM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fQUxBUk06CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLnVzYWdlID0gQVVESU9fVVNBR0VfQUxBUk07CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOgorICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS51c2FnZSA9IEFVRElPX1VTQUdFX05PVElGSUNBVElPTjsKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9EVE1GOgorICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS51c2FnZSA9IEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzsKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZOgorICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS51c2FnZSA9IEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWTsKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9BU1NJU1RBTlQ6CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLnVzYWdlID0gQVVESU9fVVNBR0VfQVNTSVNUQU5UOworICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU1BFRUNIOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1JFUk9VVElORzoKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UudXNhZ2UgPSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRTsKKyAgICAgICAgICAgIC8vIHVua25vd24gY29udGVudCB0eXBlCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fQ0FMTF9BU1NJU1RBTlQ6CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLnVzYWdlID0gQVVESU9fVVNBR0VfQ0FMTF9BU1NJU1RBTlQ7CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0g7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCiAgICAgbWV0YWRhdGEuY2hhbm5lbF9tYXNrID0gbUNoYW5uZWxNYXNrLAogICAgIHN0cm5jcHkobWV0YWRhdGEudGFncywgbUF0dHIudGFncywgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFKTsKICAgICAqYmFja0luc2VydGVyKysgPSBtZXRhZGF0YTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCmluZGV4IDJlNDllNzEuLjYwMjY3MWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaApAQCAtMjg1LDggKzI4NSw4IEBACiAKICAgICB2aXJ0dWFsIGJvb2wgICAgIGlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRId09mZmxvYWRGb3JtYXRzU3VwcG9ydGVkRm9yQmx1ZXRvb3RoTWVkaWEoCisgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgICAgIHNldEFwcFN0YXRlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCBhcHBfc3RhdGVfdCBzdGF0ZSkgPSAwOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSHdNb2R1bGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCmluZGV4IDliYTc0NWEuLjU0YjM0MDggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCkBAIC04MCw2ICs4MCw3IEBACiAKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRSb3V0ZVNpbmtEZXZpY2UoY29uc3Qgc3A8QXVkaW9Sb3V0ZT4gJnJvdXRlKSBjb25zdDsKICAgICBEZXZpY2VWZWN0b3IgZ2V0Um91dGVTb3VyY2VEZXZpY2VzKGNvbnN0IHNwPEF1ZGlvUm91dGU+ICZyb3V0ZSkgY29uc3Q7CisgICAgY29uc3QgQXVkaW9Sb3V0ZVZlY3RvciYgZ2V0Um91dGVzKCkgY29uc3QgeyByZXR1cm4gbVJvdXRlczsgfQogICAgIHZvaWQgc2V0Um91dGVzKGNvbnN0IEF1ZGlvUm91dGVWZWN0b3IgJnJvdXRlcyk7CiAKICAgICBzdGF0dXNfdCBhZGRPdXRwdXRQcm9maWxlKGNvbnN0IHNwPElPUHJvZmlsZT4gJnByb2ZpbGUpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcAppbmRleCBhOTJkMzFlLi41NjFmYWIzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcApAQCAtNTgsMTUgKzU4LDYgQEAKICAgICAgICAgbURlY2xhcmVkQWRkcmVzcyhEZXZpY2VEZXNjcmlwdG9yQmFzZTo6YWRkcmVzcygpKQogewogICAgIG1DdXJyZW50RW5jb2RlZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOwotICAgIC8qIElmIGZyYW1ld29yayBydW5zIGFnYWluc3QgYSBwcmUgNS4wIEF1ZGlvIEhBTCwgZW5jb2RlZCBmb3JtYXRzIGFyZSBhYnNlbnQgZnJvbSB0aGUgY29uZmlnLgotICAgICAqIEZJWE1FOiBBUE0gc2hvdWxkIGtub3cgdGhlIHZlcnNpb24gb2YgdGhlIEhBTCBhbmQgZG9uJ3QgYWRkIHRoZSBmb3JtYXRzIGZvciBWNS4wLgotICAgICAqIEZvciBub3csIHRoZSB3b3JrYXJvdW5kIHRvIHJlbW92ZSBBQzMgYW5kIElFQzYxOTM3IHN1cHBvcnQgb24gSERNSSBpcyB0byBkZWNsYXJlCi0gICAgICogc29tZXRoaW5nIGxpa2UgJ2VuY29kZWRGb3JtYXRzPSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCInIG9uIHRoZSBIRE1JIGRldmljZVBvcnQuCi0gICAgICovCi0gICAgaWYgKG1EZXZpY2VUeXBlQWRkci5tVHlwZSA9PSBBVURJT19ERVZJQ0VfT1VUX0hETUkgJiYgbUVuY29kZWRGb3JtYXRzLmVtcHR5KCkpIHsKLSAgICAgICAgbUVuY29kZWRGb3JtYXRzLnB1c2hfYmFjayhBVURJT19GT1JNQVRfQUMzKTsKLSAgICAgICAgbUVuY29kZWRGb3JtYXRzLnB1c2hfYmFjayhBVURJT19GT1JNQVRfSUVDNjE5MzcpOwotICAgIH0KIH0KIAogdm9pZCBEZXZpY2VEZXNjcmlwdG9yOjphdHRhY2goY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Qb2xpY3lBdWRpb1BvcnQuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvUG9saWN5QXVkaW9Qb3J0LmNwcAppbmRleCA4YzYxYjkwLi41OTg2MDY5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Qb2xpY3lBdWRpb1BvcnQuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1BvbGljeUF1ZGlvUG9ydC5jcHAKQEAgLTMwLDkgKzMwLDkgQEAKIC8vIC0tLSBQb2xpY3lBdWRpb1BvcnQgY2xhc3MgaW1wbGVtZW50YXRpb24KIHZvaWQgUG9saWN5QXVkaW9Qb3J0OjphdHRhY2goY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpCiB7CisgICAgbU1vZHVsZSA9IG1vZHVsZTsKICAgICBBTE9HVigiJXM6IGF0dGFjaGluZyBtb2R1bGUgJXMgdG8gcG9ydCAlcyIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGdldE1vZHVsZU5hbWUoKSwgYXNBdWRpb1BvcnQoKS0+Z2V0TmFtZSgpLmNfc3RyKCkpOwotICAgIG1Nb2R1bGUgPSBtb2R1bGU7CiB9CiAKIHZvaWQgUG9saWN5QXVkaW9Qb3J0OjpkZXRhY2goKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2JsdWV0b290aF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAppbmRleCA5ODQxNWI3Li4yMmZmOTU0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApAQCAtMjIsNiArMjIsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTYwMDAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiCiAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CiAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0ibGUgYXVkaW8gaW5wdXQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCwxNjAwMCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PLEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCwxNjAwMCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PLEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8zMl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwLDE2MDAwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8sQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgPC9taXhQb3J0PgogICAgIDwvbWl4UG9ydHM+CiAgICAgPGRldmljZVBvcnRzPgogICAgICAgICA8IS0tIEEyRFAgQXVkaW8gUG9ydHMgLS0+CkBAIC00OSw2ICs2MCw3IEBACiAgICAgICAgIC0tPgogICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCTEUgSGVhZHNldCBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVQiIHJvbGU9InNpbmsiLz4KICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQkxFIFNwZWFrZXIgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMRV9TUEVBS0VSIiByb2xlPSJzaW5rIi8+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJMRSBIZWFkc2V0IEluIiB0eXBlPSJBVURJT19ERVZJQ0VfSU5fQkxFX0hFQURTRVQiIHJvbGU9InNvdXJjZSIvPgogICAgIDwvZGV2aWNlUG9ydHM+CiAgICAgPHJvdXRlcz4KICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgQTJEUCBPdXQiCkBAIC02MSw2ICs3Myw4IEBACiAgICAgICAgICAgICAgICBzb3VyY2VzPSJoZWFyaW5nIGFpZCBvdXRwdXQiLz4KICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQkxFIEhlYWRzZXQgT3V0IgogICAgICAgICAgICAgICAgc291cmNlcz0ibGUgYXVkaW8gb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9ImxlIGF1ZGlvIGlucHV0IgorICAgICAgICAgICAgICAgc291cmNlcz0iQkxFIEhlYWRzZXQgSW4iLz4KICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQkxFIFNwZWFrZXIgT3V0IgogICAgICAgICAgICAgICAgc291cmNlcz0ibGUgYXVkaW8gb3V0cHV0Ii8+CiAgICAgPC9yb3V0ZXM+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwKaW5kZXggZmJlNzU3MS4uYWFkMDBkNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2JsdWV0b290aF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9ibHVldG9vdGhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbApAQCAtMjIsNiArMjIsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTYwMDAgMjQwMDAgMzIwMDAgNDQxMDAgNDgwMDAiCiAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CiAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0ibGUgYXVkaW8gaW5wdXQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCAyNDAwMCAzMjAwMCA0NDEwMCA0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PIEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCAyNDAwMCAzMjAwMCA0NDEwMCA0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PIEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8zMl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDE2MDAwIDI0MDAwIDMyMDAwIDQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgPC9taXhQb3J0PgogICAgIDwvbWl4UG9ydHM+CiAgICAgPGRldmljZVBvcnRzPgogICAgICAgICA8IS0tIEEyRFAgQXVkaW8gUG9ydHMgLS0+CkBAIC00NSw2ICs1Niw3IEBACiAgICAgICAgIDwhLS0gQkxFIEF1ZGlvIFBvcnRzIC0tPgogICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCTEUgSGVhZHNldCBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVQiIHJvbGU9InNpbmsiLz4KICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQkxFIFNwZWFrZXIgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMRV9TUEVBS0VSIiByb2xlPSJzaW5rIi8+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJMRSBIZWFkc2V0IEluIiB0eXBlPSJBVURJT19ERVZJQ0VfSU5fQkxFX0hFQURTRVQiIHJvbGU9InNvdXJjZSIvPgogICAgIDwvZGV2aWNlUG9ydHM+CiAgICAgPHJvdXRlcz4KICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgQTJEUCBPdXQiCkBAIC01Nyw2ICs2OSw4IEBACiAgICAgICAgICAgICAgICBzb3VyY2VzPSJoZWFyaW5nIGFpZCBvdXRwdXQiLz4KICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQkxFIEhlYWRzZXQgT3V0IgogICAgICAgICAgICAgICAgc291cmNlcz0ibGUgYXVkaW8gb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9ImxlIGF1ZGlvIGlucHV0IgorICAgICAgICAgICAgICAgc291cmNlcz0iQkxFIEhlYWRzZXQgSW4iLz4KICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQkxFIFNwZWFrZXIgT3V0IgogICAgICAgICAgICAgICAgc291cmNlcz0ibGUgYXVkaW8gb3V0cHV0Ii8+CiAgICAgPC9yb3V0ZXM+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvbGVfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2xlX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAppbmRleCBhM2RjNzJiLi5kY2RkODA1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvbGVfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9sZV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKQEAgLTcsMTMgKzcsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTYwMDAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiCiAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CiAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0ibGUgYXVkaW8gaW5wdXQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklULEFVRElPX0ZPUk1BVF9QQ01fMjRfQklULEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCwxNjAwMCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PLEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KICAgICA8L21peFBvcnRzPgogICAgIDxkZXZpY2VQb3J0cz4KICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQkxFIEhlYWRzZXQgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUIiByb2xlPSJzaW5rIi8+CiAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJMRSBTcGVha2VyIE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTEVfU1BFQUtFUiIgcm9sZT0ic2luayIvPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCTEUgSGVhZHNldCBJbiIgdHlwZT0iQVVESU9fREVWSUNFX0lOX0JMRV9IRUFEU0VUIiByb2xlPSJzb3VyY2UiLz4KICAgICA8L2RldmljZVBvcnRzPgogICAgIDxyb3V0ZXM+CiAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJMRSBIZWFkc2V0IE91dCIgc291cmNlcz0ibGUgYXVkaW8gb3V0cHV0Ii8+CiAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJMRSBTcGVha2VyIE91dCIgc291cmNlcz0ibGUgYXVkaW8gb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9ImxlIGF1ZGlvIGlucHV0IiBzb3VyY2VzPSJCTEUgSGVhZHNldCBJbiIvPgogICAgIDwvcm91dGVzPgogPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVEZWZhdWx0Q29uZmlnLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVEZWZhdWx0Q29uZmlnLmgKaW5kZXggZDM5ZWZmNi4uNjY1YzJkZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lRGVmYXVsdENvbmZpZy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZURlZmF1bHRDb25maWcuaApAQCAtNjksMTIgKzY5LDYgQEAKICAgICAgICAgICB7CiAgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OLCBBVURJT19TT1VSQ0VfREVGQVVMVCwKICAgICAgICAgICAgICAgIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAotICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1QsCi0gICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiIn0sCi0gICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVCwKLSAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifSwKLSAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVELAotICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVCwKICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifQogICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCmluZGV4IGJjMzI0MTYuLjBkZGY2NmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbApAQCAtNTcsOSArNTcsNiBAQAogICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwiPgogICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04iIHZvbHVtZUdyb3VwPSJub3RpZmljYXRpb24iPgogICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OIi8+IDwvQXR0cmlidXRlcz4KLSAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1QiLz4gPC9BdHRyaWJ1dGVzPgotICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVCIvPiA8L0F0dHJpYnV0ZXM+Ci0gICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEIi8+IDwvQXR0cmlidXRlcz4KICAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVCIvPiA8L0F0dHJpYnV0ZXM+CiAgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgogICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuY3BwCmluZGV4IGIwYzM3NmEuLjlhNjFhMDUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5jcHAKQEAgLTI5OSw4ICsyOTksMTMgQEAKICAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIERldmljZVZlY3RvcihkZXZpY2UpOwogICAgIH0KKyAgICByZXR1cm4gZnJvbUNhY2hlPyBnZXRDYWNoZWREZXZpY2VzKHN0cmF0ZWd5KSA6IGdldERldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3koc3RyYXRlZ3kpOworfQogCi0gICAgcmV0dXJuIGZyb21DYWNoZT8gbURldmljZXNGb3JTdHJhdGVnaWVzLmF0KHN0cmF0ZWd5KSA6IGdldERldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3koc3RyYXRlZ3kpOworRGV2aWNlVmVjdG9yIEVuZ2luZTo6Z2V0Q2FjaGVkRGV2aWNlcyhwcm9kdWN0X3N0cmF0ZWd5X3QgcHMpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1EZXZpY2VzRm9yU3RyYXRlZ2llcy5maW5kKHBzKSAhPSBtRGV2aWNlc0ZvclN0cmF0ZWdpZXMuZW5kKCkgPworICAgICAgICAgICAgICAgIG1EZXZpY2VzRm9yU3RyYXRlZ2llcy5hdChwcykgOiBEZXZpY2VWZWN0b3J7fTsKIH0KIAogRGV2aWNlVmVjdG9yIEVuZ2luZTo6Z2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBmcm9tQ2FjaGUpIGNvbnN0CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuaAppbmRleCBkOGUyNzQyLi5mNjY1ZGE1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmgKQEAgLTEyNiw2ICsxMjYsNyBAQAogICAgIHN0YXR1c190IGxvYWRBdWRpb1BvbGljeUVuZ2luZUNvbmZpZygpOwogCiAgICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSBjb25zdDsKKyAgICBEZXZpY2VWZWN0b3IgZ2V0Q2FjaGVkRGV2aWNlcyhwcm9kdWN0X3N0cmF0ZWd5X3QgcHMpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogUG9saWN5IFBhcmFtZXRlciBNYW5hZ2VyIGhpZGRlbiB0aHJvdWdoIGEgd3JhcHBlci4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKaW5kZXggYmMzMjQxNi4uMGRkZjY2ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKQEAgLTU3LDkgKzU3LDYgQEAKICAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMIj4KICAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OIiB2b2x1bWVHcm91cD0ibm90aWZpY2F0aW9uIj4KICAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTiIvPiA8L0F0dHJpYnV0ZXM+Ci0gICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUIi8+IDwvQXR0cmlidXRlcz4KLSAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQiLz4gPC9BdHRyaWJ1dGVzPgotICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRCIvPiA8L0F0dHJpYnV0ZXM+CiAgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQiLz4gPC9BdHRyaWJ1dGVzPgogICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KICAgICA8L1Byb2R1Y3RTdHJhdGVneT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCmluZGV4IGNiOWQ3MDAuLjRjZTc4NTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcApAQCAtNTI1LDEwICs1MjUsMTAgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cykKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SHdPZmZsb2FkRm9ybWF0c1N1cHBvcnRlZEZvckJsdWV0b290aE1lZGlhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKQogewotICAgIEFMT0dWKCJnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKCkiKTsKKyAgICBBTE9HVigiZ2V0SHdPZmZsb2FkRm9ybWF0c1N1cHBvcnRlZEZvckJsdWV0b290aE1lZGlhKCkiKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IGZvcm1hdFNldDsKICAgICBzcDxId01vZHVsZT4gcHJpbWFyeU1vZHVsZSA9CkBAIC01MzcsOCArNTM3LDIzIEBACiAgICAgICAgIEFMT0dFKCIlcygpIHVuYWJsZSB0byBnZXQgcHJpbWFyeSBtb2R1bGUiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KKworICAgIERldmljZVR5cGVTZXQgYXVkaW9EZXZpY2VTZXQ7CisKKyAgICBzd2l0Y2goZGV2aWNlKSB7CisgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOgorICAgICAgICBhdWRpb0RldmljZVNldCA9IGdldEF1ZGlvRGV2aWNlT3V0QWxsQTJkcFNldCgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVQ6CisgICAgICAgIGF1ZGlvRGV2aWNlU2V0ID0gZ2V0QXVkaW9EZXZpY2VPdXRBbGxCbGVTZXQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIiVzKCkgZGV2aWNlIHR5cGUgMHglMDh4IG5vdCBzdXBwb3J0ZWQiLCBfX2Z1bmNfXywgZGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKICAgICBEZXZpY2VWZWN0b3IgZGVjbGFyZWREZXZpY2VzID0gcHJpbWFyeU1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCkuZ2V0RGV2aWNlc0Zyb21UeXBlcygKLSAgICAgICAgICAgIGdldEF1ZGlvRGV2aWNlT3V0QWxsQTJkcFNldCgpKTsKKyAgICAgICAgICAgIGF1ZGlvRGV2aWNlU2V0KTsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IGRlY2xhcmVkRGV2aWNlcykgewogICAgICAgICBmb3JtYXRTZXQuaW5zZXJ0KGRldmljZS0+ZW5jb2RlZEZvcm1hdHMoKS5iZWdpbigpLCBkZXZpY2UtPmVuY29kZWRGb3JtYXRzKCkuZW5kKCkpOwogICAgIH0KQEAgLTIxNDcsNyArMjE2Miw3IEBACiAgICAgfQogCiAgICAgLy8gRXhwbGljaXQgcm91dGluZz8KLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBleHBsaWNpdFJvdXRpbmdEZXZpY2UgPSAKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBleHBsaWNpdFJvdXRpbmdEZXZpY2UgPQogICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoKnNlbGVjdGVkRGV2aWNlSWQpOwogCiAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBtbWFwIGNhcHR1cmU6IGlmIGFuIGlucHV0IElPIGhhbmRsZSBpcyBzcGVjaWZpZWQsIHdlIHJldXNlIHRoaXMgaW5wdXQgaWYKQEAgLTIzMzMsNyArMjM0OCw3IEBACiAgICAgICAgICAgICBwcm9maWxlRmxhZ3MgPSBBVURJT19JTlBVVF9GTEFHX05PTkU7IC8vIHJldHJ5CiAgICAgICAgIH0gZWxzZSB7IC8vIGZhaWwKICAgICAgICAgICAgIEFMT0dXKCIlcyBjb3VsZCBub3QgZmluZCBwcm9maWxlIGZvciBkZXZpY2UgJXMsIHNhbXBsaW5nIHJhdGUgJXUsIGZvcm1hdCAlI3gsICIKLSAgICAgICAgICAgICAgICAgICJjaGFubmVsIG1hc2sgMHglWCwgZmxhZ3MgJSN4IiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCAKKyAgICAgICAgICAgICAgICAgICJjaGFubmVsIG1hc2sgMHglWCwgZmxhZ3MgJSN4IiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCBmbGFncyk7CiAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7CiAgICAgICAgIH0KQEAgLTQ5NTMsOSArNDk2OCw4IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBtSHdNb2R1bGVzLnB1c2hfYmFjayhod01vZHVsZSk7Ci0gICAgICAgIC8vIG9wZW4gYWxsIG91dHB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcwotICAgICAgICAvLyBleGNlcHQgZm9yIGRpcmVjdCBvdXRwdXQgc3RyZWFtcyB0aGF0IGFyZSBvbmx5IG9wZW5lZCB3aGVuIHRoZXkgYXJlIGFjdHVhbGx5Ci0gICAgICAgIC8vIHJlcXVpcmVkIGJ5IGFuIGFwcC4KKyAgICAgICAgLy8gb3BlbiBhbGwgb3V0cHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzLgorICAgICAgICAvLyBkaXJlY3Qgb3V0cHV0cyBhcmUgY2xvc2VkIGltbWVkaWF0ZWx5IGFmdGVyIGNoZWNraW5nIHRoZSBhdmFpbGFiaWxpdHkgb2YgYXR0YWNoZWQgZGV2aWNlcwogICAgICAgICAvLyBUaGlzIGFsc28gdmFsaWRhdGVzIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzIGxpc3QKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBvdXRQcm9maWxlIDogaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkpIHsKICAgICAgICAgICAgIGlmICghb3V0UHJvZmlsZS0+Y2FuT3Blbk5ld0lvKCkpIHsKQEAgLTUzNTEsNyArNTM2NSw3IEBACiAgICAgICAgICAgICB9IC8vIGVuZGlmIGlucHV0ICE9IDAKIAogICAgICAgICAgICAgaWYgKGlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIiVzIGNvdWxkIG5vdCBvcGVuIGlucHV0IGZvciBkZXZpY2UgJXMiLCBfX2Z1bmNfXywgIAorICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBjb3VsZCBub3Qgb3BlbiBpbnB1dCBmb3IgZGV2aWNlICVzIiwgX19mdW5jX18sCiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICBwcm9maWxlcy5yZW1vdmVBdChwcm9maWxlX2luZGV4KTsKICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LS07CkBAIC01ODQzLDcgKzU4NTcsOCBAQAogICAgICAgICAgICAgcmV0dXJuIGhhc1ZvaWNlU3RyZWFtKHN0cmVhbXMpICYmIChvdXRwdXREZXNjID09IG1QcmltYXJ5T3V0cHV0IHx8CiAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+aXNBY3RpdmUodG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpKSkgJiYKICAgICAgICAgICAgICAgICAoaXNJbkNhbGwoKSB8fAotICAgICAgICAgICAgICAgICBtT3V0cHV0cy5pc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKHByb2R1Y3RTdHJhdGVneSwgb3V0cHV0RGVzYykpOworICAgICAgICAgICAgICAgICBtT3V0cHV0cy5pc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKHByb2R1Y3RTdHJhdGVneSwgb3V0cHV0RGVzYykpICYmCisgICAgICAgICAgICAgICAgIWlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFLCAwKTsKICAgICAgICAgfTsKIAogICAgICAgICAvLyBXaXRoIGxvdy1sYXRlbmN5IHBsYXlpbmcgb24gc3BlYWtlciwgbXVzaWMgb24gV0ZELCB3aGVuIHRoZSBmaXJzdCBsb3ctbGF0ZW5jeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaAppbmRleCA5OGY5NmQxLi5jNDg4NWU0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaApAQCAtMzIwLDggKzMyMCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnN1cnJvdW5kRm9ybWF0cyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LCBib29sIGVuYWJsZWQpOwogCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKLSAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRId09mZmxvYWRGb3JtYXRzU3VwcG9ydGVkRm9yQmx1ZXRvb3RoTWVkaWEoCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cyk7CiAKICAgICAgICAgdmlydHVhbCB2b2lkIHNldEFwcFN0YXRlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCBhcHBfc3RhdGVfdCBzdGF0ZSk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQW5kcm9pZC5icAppbmRleCA0NTRjMDIwLi5kNTA0NjU5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BbmRyb2lkLmJwCkBAIC00Nyw2ICs0Nyw3IEBACiAgICAgICAgICJhdWRpb3BvbGljeS10eXBlcy1haWRsLWNwcCIsCiAgICAgICAgICJjYXB0dXJlX3N0YXRlX2xpc3RlbmVyLWFpZGwtY3BwIiwKICAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKKyAgICAgICAgInBhY2thZ2VtYW5hZ2VyX2FpZGwtY3BwIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcAppbmRleCA3NzIyM2I2Li42MmRiYzhkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCkBAIC0xODc3LDggKzE4NzcsOCBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLVN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCi0gICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4qIF9haWRsX3JldHVybikgeworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SHdPZmZsb2FkRm9ybWF0c1N1cHBvcnRlZEZvckJsdWV0b290aE1lZGlhKAorICAgICAgICBpbnQzMl90IGRldmljZUFpZGwsIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4qIF9haWRsX3JldHVybikgewogICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiBmb3JtYXRzOwogCiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewpAQCAtMTg4Niw4ICsxODg2LDEwIEBACiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2RldmljZXNfdChkZXZpY2VBaWRsKSk7CiAgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKLSAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoJmZvcm1hdHMpKSk7CisgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRId09mZmxvYWRGb3JtYXRzU3VwcG9ydGVkRm9yQmx1ZXRvb3RoTWVkaWEoZGV2aWNlLCAmZm9ybWF0cykpKTsKICAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4+KAogICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IDRkMGUxZjEuLjkxOTAyNTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTQwOSw3ICs0MDksNyBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6b25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwICYmIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZCkgewpAQCAtOTcwLDcgKzk3MCw3IEBACiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllczoKICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9zZXRVc2VySWREZXZpY2VBZmZpbml0aWVzOgogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3JlbW92ZVVzZXJJZERldmljZUFmZmluaXRpZXM6Ci0gICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUDoKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9nZXRId09mZmxvYWRGb3JtYXRzU3VwcG9ydGVkRm9yQmx1ZXRvb3RoTWVkaWE6CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fbGlzdEF1ZGlvVm9sdW1lR3JvdXBzOgogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2dldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlczoKICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9hY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbjoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCmluZGV4IDdlZDgyOWMuLjllYzUzNDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaApAQCAtMTk0LDggKzE5NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGJvb2w+KiBmb3JtYXRzRW5hYmxlZCkgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgZ2V0UmVwb3J0ZWRTdXJyb3VuZEZvcm1hdHMoCiAgICAgICAgICAgICBtZWRpYTo6SW50KiBjb3VudCwgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0PiogZm9ybWF0cykgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgZ2V0SHdPZmZsb2FkRm9ybWF0c1N1cHBvcnRlZEZvckJsdWV0b290aE1lZGlhKAorICAgICAgICAgICAgaW50MzJfdCBkZXZpY2UsIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCBhdWRpb0Zvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBzZXRBc3Npc3RhbnRVaWQoaW50MzJfdCB1aWQpIG92ZXJyaWRlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAKaW5kZXggYTE2YWI3ZC4uOWQyZDJiMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwCkBAIC0xMzc1LDcgKzEzNzUsOCBAQAogICAgIGlmICh0eXBlID09IEFVRElPX0RFVklDRV9PVVRfSERNSSkgewogICAgICAgICAvLyBTZXQgZGV2aWNlIGNvbm5lY3Rpb24gc3RhdGUgZmFpbGVkIGR1ZSB0byBubyBkZXZpY2UgZGVzY3JpcHRvciBmb3VuZAogICAgICAgICAvLyBGb3IgSERNSSBjYXNlLCBpdCBpcyBlYXNpZXIgdG8gc2ltdWxhdGUgZGV2aWNlIGRlc2NyaXB0b3Igbm90IGZvdW5kIGVycm9yCi0gICAgICAgIC8vIGJ5IHVzaW5nIGEgdW5kZWNsYXJlZCBlbmNvZGVkIGZvcm1hdC4KKyAgICAgICAgLy8gYnkgdXNpbmcgYW4gZW5jb2RlZCBmb3JtYXQgd2hpY2ggaXNuJ3QgbGlzdGVkIGluIHRoZSAnZW5jb2RlZEZvcm1hdHMnCisgICAgICAgIC8vIGF0dHJpYnV0ZSBmb3IgdGhpcyBkZXZpY2VQb3J0LgogICAgICAgICBBU1NFUlRfRVEoSU5WQUxJRF9PUEVSQVRJT04sIG1NYW5hZ2VyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCiAgICAgICAgICAgICAgICAgdHlwZSwgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCiAgICAgICAgICAgICAgICAgYWRkcmVzcy5jX3N0cigpLCBuYW1lLmNfc3RyKCksIEFVRElPX0ZPUk1BVF9NQVRfMl8xKSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9yZXNvdXJjZXMvdGVzdF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9yZXNvdXJjZXMvdGVzdF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKaW5kZXggODdmMGFiOS4uNDFlZDcwYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvcmVzb3VyY2VzL3Rlc3RfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3Jlc291cmNlcy90ZXN0X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApAQCAtNTAsNyArNTAsOCBAQAogICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KICAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCdWlsdC1JbiBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyIgcm9sZT0ic291cmNlIj4KICAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+Ci0gICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iSGRtaSIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9IRE1JIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJIZG1pIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0hETUkiIHJvbGU9InNpbmsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZEZvcm1hdHM9IkFVRElPX0ZPUk1BVF9BQzMiPgogICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KICAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJIZG1pLUluIE1pYyIgdHlwZT0iQVVESU9fREVWSUNFX0lOX0hETUkiIHJvbGU9InNvdXJjZSI+CiAgICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAppbmRleCAwNGI1NjA0Li4wYjZiMWZiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcApAQCAtMzYzLDE2ICszNjMsMTggQEAKICAgICBzdGQ6OnN0cmluZyBjYW1lcmFJZChpZC5jX3N0cigpKTsKICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCBjb3N0OwogICAgIHN0YXR1c190IHJlcyA9IG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmdldFJlc291cmNlQ29zdChjYW1lcmFJZCwgJmNvc3QpOwotICAgIFN5c3RlbUNhbWVyYUtpbmQgZGV2aWNlS2luZCA9IFN5c3RlbUNhbWVyYUtpbmQ6OlBVQkxJQzsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcXVlcnkgZGV2aWNlIHJlc291cmNlIGNvc3Q6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBTeXN0ZW1DYW1lcmFLaW5kIGRldmljZUtpbmQgPSBTeXN0ZW1DYW1lcmFLaW5kOjpQVUJMSUM7CiAgICAgcmVzID0gbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+Z2V0U3lzdGVtQ2FtZXJhS2luZChjYW1lcmFJZCwgJmRldmljZUtpbmQpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBxdWVyeSBkZXZpY2Uga2luZDogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKKyAgICBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5pc0xvZ2ljYWxDYW1lcmEoY2FtZXJhSWQsICZwaHlzaWNhbENhbWVyYUlkcyk7CiAgICAgc3RkOjpzZXQ8U3RyaW5nOD4gY29uZmxpY3Rpbmc7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3N0LmNvbmZsaWN0aW5nRGV2aWNlcy5zaXplKCk7IGkrKykgewogICAgICAgICBjb25mbGljdGluZy5lbXBsYWNlKFN0cmluZzgoY29zdC5jb25mbGljdGluZ0RldmljZXNbaV0uY19zdHIoKSkpOwpAQCAtMzgxLDcgKzM4Myw3IEBACiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtQ2FtZXJhU3RhdGVzTG9jayk7CiAgICAgICAgIG1DYW1lcmFTdGF0ZXMuZW1wbGFjZShpZCwgc3RkOjptYWtlX3NoYXJlZDxDYW1lcmFTdGF0ZT4oaWQsIGNvc3QucmVzb3VyY2VDb3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0aW5nLCBkZXZpY2VLaW5kKSk7CisgICAgICAgICAgICAgICAgY29uZmxpY3RpbmcsIGRldmljZUtpbmQsIHBoeXNpY2FsQ2FtZXJhSWRzKSk7CiAgICAgfQogCiAgICAgaWYgKG1GbGFzaGxpZ2h0LT5oYXNGbGFzaFVuaXQoaWQpKSB7CkBAIC01NjAsNiArNTYyLDEzIEBACiAgICAgb25Ub3JjaFN0YXR1c0NoYW5nZWRMb2NrZWQoY2FtZXJhSWQsIG5ld1N0YXR1cywgc3lzdGVtQ2FtZXJhS2luZCk7CiB9CiAKKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpvblRvcmNoU3RhdHVzQ2hhbmdlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgVG9yY2hNb2RlU3RhdHVzIG5ld1N0YXR1cywgU3lzdGVtQ2FtZXJhS2luZCBzeXN0ZW1DYW1lcmFLaW5kKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1Ub3JjaFN0YXR1c011dGV4KTsKKyAgICBvblRvcmNoU3RhdHVzQ2hhbmdlZExvY2tlZChjYW1lcmFJZCwgbmV3U3RhdHVzLCBzeXN0ZW1DYW1lcmFLaW5kKTsKK30KKwogdm9pZCBDYW1lcmFTZXJ2aWNlOjpvblRvcmNoU3RhdHVzQ2hhbmdlZExvY2tlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgVG9yY2hNb2RlU3RhdHVzIG5ld1N0YXR1cywgU3lzdGVtQ2FtZXJhS2luZCBzeXN0ZW1DYW1lcmFLaW5kKSB7CiAgICAgQUxPR0koIiVzOiBUb3JjaCBzdGF0dXMgY2hhbmdlZCBmb3IgY2FtZXJhSWQ9JXMsIG5ld1N0YXR1cz0lZCIsCkBAIC0zNjgzLDkgKzM2OTIsMTAgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQ2FtZXJhU2VydmljZTo6Q2FtZXJhU3RhdGU6OkNhbWVyYVN0YXRlKGNvbnN0IFN0cmluZzgmIGlkLCBpbnQgY29zdCwKLSAgICAgICAgY29uc3Qgc3RkOjpzZXQ8U3RyaW5nOD4mIGNvbmZsaWN0aW5nLCBTeXN0ZW1DYW1lcmFLaW5kIHN5c3RlbUNhbWVyYUtpbmQpIDogbUlkKGlkKSwKKyAgICAgICAgY29uc3Qgc3RkOjpzZXQ8U3RyaW5nOD4mIGNvbmZsaWN0aW5nLCBTeXN0ZW1DYW1lcmFLaW5kIHN5c3RlbUNhbWVyYUtpbmQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcGh5c2ljYWxDYW1lcmFzKSA6IG1JZChpZCksCiAgICAgICAgIG1TdGF0dXMoU3RhdHVzSW50ZXJuYWw6Ok5PVF9QUkVTRU5UKSwgbUNvc3QoY29zdCksIG1Db25mbGljdGluZyhjb25mbGljdGluZyksCi0gICAgICAgIG1TeXN0ZW1DYW1lcmFLaW5kKHN5c3RlbUNhbWVyYUtpbmQpIHt9CisgICAgICAgIG1TeXN0ZW1DYW1lcmFLaW5kKHN5c3RlbUNhbWVyYUtpbmQpLCBtUGh5c2ljYWxDYW1lcmFzKHBoeXNpY2FsQ2FtZXJhcykge30KIAogQ2FtZXJhU2VydmljZTo6Q2FtZXJhU3RhdGU6On5DYW1lcmFTdGF0ZSgpIHt9CiAKQEAgLTM3MjQsNiArMzczNCwxMSBAQAogICAgIHJldHVybiBtU3lzdGVtQ2FtZXJhS2luZDsKIH0KIAorYm9vbCBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFTdGF0ZTo6Y29udGFpbnNQaHlzaWNhbENhbWVyYShjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFJZCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6OmZpbmQobVBoeXNpY2FsQ2FtZXJhcy5iZWdpbigpLCBtUGh5c2ljYWxDYW1lcmFzLmVuZCgpLCBwaHlzaWNhbENhbWVyYUlkKQorICAgICAgICAgICAgIT0gbVBoeXNpY2FsQ2FtZXJhcy5lbmQoKTsKK30KKwogYm9vbCBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFTdGF0ZTo6YWRkVW5hdmFpbGFibGVQaHlzaWNhbElkKGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsSWQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3RhdHVzTG9jayk7CiAgICAgYXV0byByZXN1bHQgPSBtVW5hdmFpbGFibGVQaHlzaWNhbElkcy5pbnNlcnQocGh5c2ljYWxJZCk7CkBAIC00MzQyLDE4ICs0MzU3LDkgQEAKICAgICBzdGQ6Omxpc3Q8U3RyaW5nMTY+IHJldExpc3Q7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUNhbWVyYVN0YXRlc0xvY2spOwogICAgIGZvciAoY29uc3QgYXV0byYgc3RhdGUgOiBtQ2FtZXJhU3RhdGVzKSB7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKLSAgICAgICAgaWYgKCFtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5pc0xvZ2ljYWxDYW1lcmEoc3RhdGUuZmlyc3QuY19zdHIoKSwgJnBoeXNpY2FsQ2FtZXJhSWRzKSkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoc3RhdGUuc2Vjb25kLT5jb250YWluc1BoeXNpY2FsQ2FtZXJhKHBoeXNpY2FsQ2FtZXJhSWQuY19zdHIoKSkpIHsKKyAgICAgICAgICAgIHJldExpc3QuZW1wbGFjZV9iYWNrKFN0cmluZzE2KHN0YXRlLmZpcnN0KSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHN0ZDo6ZmluZChwaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLCBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwgcGh5c2ljYWxDYW1lcmFJZC5jX3N0cigpKQotICAgICAgICAgICAgICAgID09IHBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpKSB7Ci0gICAgICAgICAgICAvLyBjYW1lcmFJZCBpcyBub3QgYSBwaHlzaWNhbCBjYW1lcmEgb2YgdGhpcyBsb2dpY2FsIG11bHRpLWNhbWVyYS4KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0TGlzdC5lbXBsYWNlX2JhY2soU3RyaW5nMTYoc3RhdGUuZmlyc3QpKTsKICAgICB9CiAgICAgcmV0dXJuIHJldExpc3Q7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKaW5kZXggYmMyZTM0Ny4uZDVmZWVlYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaApAQCAtMTEwLDggKzExMCwxNiBAQAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgb25EZXZpY2VTdGF0dXNDaGFuZ2VkKGNvbnN0IFN0cmluZzggJmNhbWVyYUlkLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmcGh5c2ljYWxDYW1lcmFJZCwKICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzIG5ld0hhbFN0YXR1cykgb3ZlcnJpZGU7CisgICAgLy8gVGhpcyBtZXRob2QgbWF5IGhvbGQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptSW50ZXJmYWNlTXV0ZXggYXMgYSBwYXJ0CisgICAgLy8gb2YgY2FsbGluZyBnZXRTeXN0ZW1DYW1lcmFLaW5kKCkgaW50ZXJuYWxseS4gQ2FyZSBzaG91bGQgYmUgdGFrZW4gbm90IHRvCisgICAgLy8gZGlyZWN0bHkgLyBpbmRpcmVjdGx5IGNhbGwgdGhpcyBmcm9tIGNhbGxlcnMgd2hvIGFsc28gaG9sZAorICAgIC8vIG1JbnRlcmZhY2VNdXRleC4KICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG9uVG9yY2hTdGF0dXNDaGFuZ2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpUb3JjaE1vZGVTdGF0dXMgbmV3U3RhdHVzKSBvdmVycmlkZTsKKyAgICAvLyBEb2VzIG5vdCBob2xkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bUludGVyZmFjZU11dGV4LgorICAgIHZpcnR1YWwgdm9pZCAgICAgICAgb25Ub3JjaFN0YXR1c0NoYW5nZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1cyBuZXdTdGF0dXMsCisgICAgICAgICAgICBTeXN0ZW1DYW1lcmFLaW5kIGtpbmQpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgb25OZXdQcm92aWRlclJlZ2lzdGVyZWQoKSBvdmVycmlkZTsKIAogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNTYzLDcgKzU3MSw3IEBACiAgICAgICAgICAqIHJldHVybmVkIGluIHRoZSBIQUwncyBjYW1lcmFfaW5mbyBzdHJ1Y3QgZm9yIGVhY2ggZGV2aWNlLgogICAgICAgICAgKi8KICAgICAgICAgQ2FtZXJhU3RhdGUoY29uc3QgU3RyaW5nOCYgaWQsIGludCBjb3N0LCBjb25zdCBzdGQ6OnNldDxTdHJpbmc4PiYgY29uZmxpY3RpbmcsCi0gICAgICAgICAgICAgICAgU3lzdGVtQ2FtZXJhS2luZCBkZXZpY2VLaW5kKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW1DYW1lcmFLaW5kIGRldmljZUtpbmQsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcGh5c2ljYWxDYW1lcmFzKTsKICAgICAgICAgdmlydHVhbCB+Q2FtZXJhU3RhdGUoKTsKIAogICAgICAgICAvKioKQEAgLTYyMSw2ICs2MjksMTIgQEAKICAgICAgICAgU3lzdGVtQ2FtZXJhS2luZCBnZXRTeXN0ZW1DYW1lcmFLaW5kKCkgY29uc3Q7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB3aGV0aGVyIHRoaXMgY2FtZXJhIGlzIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEgYW5kIGhhcyBhCisgICAgICAgICAqIHBhcnRpY3VsYXIgcGh5c2ljYWwgc3ViLWNhbWVyYS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgY29udGFpbnNQaHlzaWNhbENhbWVyYShjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFJZCkgY29uc3Q7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIEFkZC9SZW1vdmUgdGhlIHVuYXZhaWxhYmxlIHBoeXNpY2FsIGNhbWVyYSBJRC4KICAgICAgICAgICovCiAgICAgICAgIGJvb2wgYWRkVW5hdmFpbGFibGVQaHlzaWNhbElkKGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsSWQpOwpAQCAtNjQxLDYgKzY1NSw3IEBACiAgICAgICAgIG11dGFibGUgTXV0ZXggbVN0YXR1c0xvY2s7CiAgICAgICAgIENhbWVyYVBhcmFtZXRlcnMgbVNoaW1QYXJhbXM7CiAgICAgICAgIGNvbnN0IFN5c3RlbUNhbWVyYUtpbmQgbVN5c3RlbUNhbWVyYUtpbmQ7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtUGh5c2ljYWxDYW1lcmFzOyAvLyBFbXB0eSBpZiBub3QgYSBsb2dpY2FsIG11bHRpLWNhbWVyYQogICAgIH07IC8vIGNsYXNzIENhbWVyYVN0YXRlCiAKICAgICAvLyBPYnNlcnZlciBmb3IgVUlEIGxpZmVjeWNsZSBlbmZvcmNpbmcgdGhhdCBVSURzIGluIGlkbGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAKaW5kZXggNGYyYjg3OC4uMGUwZjE1ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAKQEAgLTE5NTAsMTYgKzE5NTAsMTkgQEAKICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAogICAgICAgICBUb3JjaE1vZGVTdGF0dXMgbmV3U3RhdHVzKSB7CiAgICAgc3A8U3RhdHVzTGlzdGVuZXI+IGxpc3RlbmVyOworICAgIFN5c3RlbUNhbWVyYUtpbmQgc3lzdGVtQ2FtZXJhS2luZCA9IFN5c3RlbUNhbWVyYUtpbmQ6OlBVQkxJQzsKICAgICBzdGQ6OnN0cmluZyBpZDsKKyAgICBib29sIGtub3duID0gZmFsc2U7CiAgICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTWFuYWdlci0+bVN0YXR1c0xpc3RlbmVyTXV0ZXgpOwotICAgICAgICBib29sIGtub3duID0gZmFsc2U7CisgICAgICAgIC8vIEhvbGQgbUxvY2sgZm9yIGFjY2Vzc2luZyBtRGV2aWNlcworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CiAgICAgICAgIGZvciAoYXV0byYgZGV2aWNlSW5mbyA6IG1EZXZpY2VzKSB7CiAgICAgICAgICAgICBpZiAoZGV2aWNlSW5mby0+bU5hbWUgPT0gY2FtZXJhRGV2aWNlTmFtZSkgewogICAgICAgICAgICAgICAgIEFMT0dJKCJDYW1lcmEgZGV2aWNlICVzIHRvcmNoIHN0YXR1cyBpcyBub3cgJXMiLCBjYW1lcmFEZXZpY2VOYW1lLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICB0b3JjaFN0YXR1c1RvU3RyaW5nKG5ld1N0YXR1cykpOwogICAgICAgICAgICAgICAgIGlkID0gZGV2aWNlSW5mby0+bUlkOwogICAgICAgICAgICAgICAgIGtub3duID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzeXN0ZW1DYW1lcmFLaW5kID0gZGV2aWNlSW5mby0+bVN5c3RlbUNhbWVyYUtpbmQ7CiAgICAgICAgICAgICAgICAgaWYgKFRvcmNoTW9kZVN0YXR1czo6QVZBSUxBQkxFX09OICE9IG5ld1N0YXR1cykgewogICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci0+cmVtb3ZlUmVmKERldmljZU1vZGU6OlRPUkNILCBpZCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTk3MSwxMSArMTk3NCwxOSBAQAogICAgICAgICAgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIGNhbWVyYURldmljZU5hbWUuY19zdHIoKSwgbmV3U3RhdHVzKTsKICAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwogICAgICAgICB9CisgICAgICAgIC8vIG5vIGxvY2sgbmVlZGVkIHNpbmNlIGxpc3RlbmVyIGlzIHNldCB1cCBvbmx5IG9uY2UgZHVyaW5nCisgICAgICAgIC8vIENhbWVyYVByb3ZpZGVyTWFuYWdlciBpbml0aWFsaXphdGlvbiBhbmQgdGhlbiBuZXZlciBjaGFuZ2VkIHRpbGwgaXQgaXMKKyAgICAgICAgLy8gZGVzdHJ1Y3RlZC4KICAgICAgICAgbGlzdGVuZXIgPSBtTWFuYWdlci0+Z2V0U3RhdHVzTGlzdGVuZXIoKTsKLSAgICB9CisgICAgIH0KICAgICAvLyBDYWxsIHdpdGhvdXQgbG9jayBoZWxkIHRvIGFsbG93IHJlZW50cmFuY3kgaW50byBwcm92aWRlciBtYW5hZ2VyCisgICAgLy8gVGhlIHByb2JsZW0gd2l0aCBob2xkaW5nIG1Mb2NrIGhlcmUgaXMgdGhhdCB3ZQorICAgIC8vIG1pZ2h0IGJlIGxpbWl0aW5nIHJlLWVudHJhbmN5IDogQ2FtZXJhU2VydmljZTo6b25Ub3JjaFN0YXR1c0NoYW5nZWQgY2FsbHMKKyAgICAvLyBiYWNrIGludG8gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyIHdoaWNoIG1pZ2h0IHRyeSB0byBob2xkIG1Mb2NrIGFnYWluIChlZzoKKyAgICAvLyBmaW5kRGV2aWNlSW5mbywgd2hpY2ggc2hvdWxkIGJlIGhvbGRpbmcgbUxvY2sgd2hpbGUgaXRlcmF0aW5nIHRocm91Z2gKKyAgICAvLyBlYWNoIHByb3ZpZGVyJ3MgZGV2aWNlcykuCiAgICAgaWYgKGxpc3RlbmVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgbGlzdGVuZXItPm9uVG9yY2hTdGF0dXNDaGFuZ2VkKFN0cmluZzgoaWQuY19zdHIoKSksIG5ld1N0YXR1cyk7CisgICAgICAgIGxpc3RlbmVyLT5vblRvcmNoU3RhdHVzQ2hhbmdlZChTdHJpbmc4KGlkLmNfc3RyKCkpLCBuZXdTdGF0dXMsIHN5c3RlbUNhbWVyYUtpbmQpOwogICAgIH0KICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaAppbmRleCAxYmRiYjQ0Li5iYWYyMGM5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oCkBAIC0xNTYsNiArMTU2LDkgQEAKICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZwaHlzaWNhbENhbWVyYUlkLAogICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cykgPSAwOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25Ub3JjaFN0YXR1c0NoYW5nZWQoY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpUb3JjaE1vZGVTdGF0dXMgbmV3U3RhdHVzLAorICAgICAgICAgICAgICAgIFN5c3RlbUNhbWVyYUtpbmQga2luZCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgb25Ub3JjaFN0YXR1c0NoYW5nZWQoY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpUb3JjaE1vZGVTdGF0dXMgbmV3U3RhdHVzKSA9IDA7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbk5ld1Byb3ZpZGVyUmVnaXN0ZXJlZCgpID0gMDsKICAgICB9OwpAQCAtMzM2LDggKzMzOSw2IEBACiAgICAgLy8gQWxsIHByaXZhdGUgbWVtYmVycywgdW5sZXNzIG90aGVyd2lzZSBub3RlZCwgZXhwZWN0IG1JbnRlcmZhY2VNdXRleCB0byBiZSBsb2NrZWQgYmVmb3JlIHVzZQogICAgIG11dGFibGUgc3RkOjptdXRleCBtSW50ZXJmYWNlTXV0ZXg7CiAKLSAgICAvLyB0aGUgc3RhdHVzIGxpc3RlbmVyIHVwZGF0ZSBjYWxsYmFja3Mgd2lsbCBsb2NrIG1TdGF0dXNNdXRleAotICAgIG11dGFibGUgc3RkOjptdXRleCBtU3RhdHVzTGlzdGVuZXJNdXRleDsKICAgICB3cDxTdGF0dXNMaXN0ZW5lcj4gbUxpc3RlbmVyOwogICAgIFNlcnZpY2VJbnRlcmFjdGlvblByb3h5KiBtU2VydmljZVByb3h5OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0NhbWVyYVByb3ZpZGVyTWFuYWdlclRlc3QuY3BwCmluZGV4IGE3NGZkOWQuLmM4YTZiMzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0NhbWVyYVByb3ZpZGVyTWFuYWdlclRlc3QuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0NhbWVyYVByb3ZpZGVyTWFuYWdlclRlc3QuY3BwCkBAIC0yNzQsNiArMjc0LDggQEAKICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzKSBvdmVycmlkZSB7fQogICAgIHZvaWQgb25Ub3JjaFN0YXR1c0NoYW5nZWQoY29uc3QgU3RyaW5nOCAmLAogICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpUb3JjaE1vZGVTdGF0dXMpIG92ZXJyaWRlIHt9CisgICAgdm9pZCBvblRvcmNoU3RhdHVzQ2hhbmdlZChjb25zdCBTdHJpbmc4ICYsCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1cywgU3lzdGVtQ2FtZXJhS2luZCkgb3ZlcnJpZGUge30KICAgICB2b2lkIG9uTmV3UHJvdmlkZXJSZWdpc3RlcmVkKCkgb3ZlcnJpZGUge30KIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvT1dORVJTIGIvc2VydmljZXMvbWVkaWFjb2RlYy9PV05FUlMKaW5kZXggYzcxNmNjZS4uMzQ1M2E3NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9PV05FUlMKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9PV05FUlMKQEAgLTEsMiArMSwzIEBACiBqZWZmdkBnb29nbGUuY29tCi1tYXJjb25lQGdvb2dsZS5jb20KK2Vzc2lja0Bnb29nbGUuY29tCit3b25zaWtAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAtc2VydmljZS5yYyBiL3NlcnZpY2VzL21lZGlhY29kZWMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wLXNlcnZpY2UucmMKaW5kZXggM2VmOWE4NS4uODQ1ZTVjYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAtc2VydmljZS5yYworKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMC1zZXJ2aWNlLnJjCkBAIC0zLDQgKzMsNCBAQAogICAgIHVzZXIgbWVkaWFjb2RlYwogICAgIGdyb3VwIGNhbWVyYSBkcm1ycGMgbWVkaWFkcm0KICAgICBpb3ByaW8gcnQgNAotICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKKyAgICB0YXNrX3Byb2ZpbGVzIFByb2Nlc3NDYXBhY2l0eUhpZ2gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L0FuZHJvaWQuYnAKaW5kZXggNjk2Yjk2Ny4uZDEwZTMzOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L0FuZHJvaWQuYnAKQEAgLTcsNyArNyw3IEBACiAgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfc2VydmljZXNfbWVkaWFjb2RlY19saWNlbnNlIl0sCiB9CiAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50IiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIHNyY3M6IFsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9mdXp6ZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9mdXp6ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2FmYmYxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L2Z1enplci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X3NlcnZpY2VzX21lZGlhY29kZWNfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfc2VydmljZXNfbWVkaWFjb2RlY19saWNlbnNlIl0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJjb2RlY1NlcnZpY2VSZWdpc3RyYW50X2Z1enplciIsCisgICAgc3JjczogWworICAgICAgICAiY29kZWNTZXJ2aWNlUmVnaXN0cmFudF9mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50IiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzItaGlkbC1kZWZhdWx0cyIsCisgICAgXSwKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgICBjYzogWworICAgICAgICAgICAgImFuZHJvaWQtbWVkaWEtZnV6emluZy1yZXBvcnRzQGdvb2dsZS5jb20iLAorICAgICAgICBdLAorICAgICAgICBjb21wb25lbnRpZDogMTU1Mjc2LAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvZnV6emVyL1JFQURNRS5tZCBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9mdXp6ZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZmEwNjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvZnV6emVyL1JFQURNRS5tZApAQCAtMCwwICsxLDU2IEBACisjIEZ1enplciBmb3IgbGlibWVkaWFfY29kZWNzZXJ2aWNlcmVnaXN0cmFudAorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgbGlibWVkaWFfY29kZWNzZXJ2aWNlcmVnaXN0cmFudCBpcyBkZXNpZ25lZCBiYXNlZCBvbiB0aGUgdW5kZXJzdGFuZGluZyBvZiB0aGUgbGlicmFyeSBhbmQgdHJpZXMgdG8gYWNoaWV2ZSB0aGUgZm9sbG93aW5nOgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZSBub3QgaGFyZGNvZGVkLCBidXQgaW5zdGVhZCBzZWxlY3RlZCBiYXNlZCBvbgoraW5jb21pbmcgZGF0YS4gVGhpcyBlbnN1cmVzIG1vcmUgY29kZSBwYXRocyBhcmUgcmVhY2hlZCBieSB0aGUgZnV6emVyLgorCitsaWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKzEuIEMyU3RyaW5nIChwYXJhbWV0ZXIgbmFtZTogYGMyU3RyaW5nYCkKKzIuIFdpZHRoIChwYXJhbWV0ZXIgbmFtZTogYHdpZHRoYCkKKzMuIEhlaWdodCAocGFyYW1ldGVyIG5hbWU6IGBoZWlnaHRgKQorNC4gU2FtcGxpbmdSYXRlIChwYXJhbWV0ZXIgbmFtZTogYHNhbXBsaW5nUmF0ZWApCis1LiBDaGFubmVscyAocGFyYW1ldGVyIG5hbWU6IGBjaGFubmVsc2ApCis2LiBTdHJlYW0gKHBhcmFtZXRlciBuYW1lOiBgc3RyZWFtYCkKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8IGBjMlN0cmluZ2AgfGBTdHJpbmdgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8IGB3aWR0aGAgfGBVSU5UMzJfTUlOYCB0byBgVUlOVDMyX01BWGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3wgYGhlaWdodGAgfGBVSU5UMzJfTUlOYCB0byBgVUlOVDMyX01BWGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3wgYHNhbXBsaW5nUmF0ZWAgfGBVSU5UMzJfTUlOYCB0byBgVUlOVDMyX01BWGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3wgYGNoYW5uZWxzYCB8YFVJTlQzMl9NSU5gIHRvIGBVSU5UMzJfTUFYYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfCBgc3RyZWFtYCB8YFVJTlQzMl9NSU5gIHRvIGBVSU5UMzJfTUFYYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorCitUaGlzIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gaXMgYWx3YXlzIGRldGVybWluaXN0aWMgZm9yIGFueSBnaXZlbiBpbnB1dC4KKworIyMjIyMgTWF4aW1pemUgdXRpbGl6YXRpb24gb2YgaW5wdXQgZGF0YQorVGhlIHBsdWdpbiBmZWVkcyB0aGUgZW50aXJlIGlucHV0IGRhdGEgdG8gdGhlIGxpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQgbW9kdWxlLgorVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiB0b2xlcmF0ZXMgYW55IGtpbmQgb2YgaW5wdXQgKGVtcHR5LCBodWdlLAorbWFsZm9ybWVkLCBldGMpIGFuZCBkb2VzbnQgYGV4aXQoKWAgb24gYW55IGlucHV0IGFuZCB0aGVyZWJ5IGluY3JlYXNpbmcgdGhlCitjaGFuY2Ugb2YgaWRlbnRpZnlpbmcgdnVsbmVyYWJpbGl0aWVzLgorCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBjb2RlY1NlcnZpY2VSZWdpc3RyYW50X2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgY29kZWNTZXJ2aWNlUmVnaXN0cmFudF9mdXp6ZXIKK2BgYAorIyMjIyBTdGVwcyB0byBydW4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6LyR7VEFSR0VUX0FSQ0h9L2NvZGVjU2VydmljZVJlZ2lzdHJhbnRfZnV6emVyL2NvZGVjU2VydmljZVJlZ2lzdHJhbnRfZnV6emVyCitgYGAKKworIyMgUmVmZXJlbmNlczoKKyAqIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xpYkZ1enplci5odG1sCisgKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29zcy1mdXp6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvZnV6emVyL2NvZGVjU2VydmljZVJlZ2lzdHJhbnRfZnV6emVyLmNwcCBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9mdXp6ZXIvY29kZWNTZXJ2aWNlUmVnaXN0cmFudF9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1OTgzZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvZnV6emVyL2NvZGVjU2VydmljZVJlZ2lzdHJhbnRfZnV6emVyLmNwcApAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiLi4vQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5jcHAiCisjaW5jbHVkZSAiZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oIgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitjb25zdGV4cHIgY2hhciBrU2VydmljZU5hbWVbXSA9ICJzb2Z0d2FyZSI7CisKK2NsYXNzIENvZGVjU2VydmljZVJlZ2lzdHJhbnRGdXp6ZXIgeworcHVibGljOgorICB2b2lkIHByb2Nlc3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICB+Q29kZWNTZXJ2aWNlUmVnaXN0cmFudEZ1enplcigpIHsKKyAgICBkZWxldGUgbUgyQzI7CisgICAgaWYgKG1JbnB1dFNpemUpIHsKKyAgICAgIGRlbGV0ZSBtSW5wdXRTaXplOworICAgIH0KKyAgICBpZiAobVNhbXBsZVJhdGVJbmZvKSB7CisgICAgICBkZWxldGUgbVNhbXBsZVJhdGVJbmZvOworICAgIH0KKyAgICBpZiAobUNoYW5uZWxDb3VudEluZm8pIHsKKyAgICAgIGRlbGV0ZSBtQ2hhbm5lbENvdW50SW5mbzsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCBpbml0SDJDMkNvbXBvbmVudFN0b3JlKCk7CisgIHZvaWQgaW52b2tlSDJDMkNvbXBvbmVudFN0b3JlKCk7CisgIHZvaWQgaW52b2tlQ29uZmlnU00oKTsKKyAgdm9pZCBpbnZva2VRdWVyeVNNKCk7CisgIEgyQzJDb21wb25lbnRTdG9yZSAqbUgyQzIgPSBudWxscHRyOworICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQgKm1JbnB1dFNpemUgPSBudWxscHRyOworICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgKm1TYW1wbGVSYXRlSW5mbyA9IG51bGxwdHI7CisgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0ICptQ2hhbm5lbENvdW50SW5mbyA9IG51bGxwdHI7CisgIEMyUGFyYW06OkluZGV4IG1JbmRleCA9IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFOworICBDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dCBtRnJhbWVSYXRlOworICBGdXp6ZWREYXRhUHJvdmlkZXIgKm1GRFAgPSBudWxscHRyOworfTsKKwordm9pZCBDb2RlY1NlcnZpY2VSZWdpc3RyYW50RnV6emVyOjppbml0SDJDMkNvbXBvbmVudFN0b3JlKCkgeworICB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOworICBzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHN0b3JlID0KKyAgICAgIGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKTsKKyAgaWYgKCFzdG9yZSkgeworICAgIHJldHVybjsKKyAgfQorICBhbmRyb2lkOjpzcDxWMV8xOjpJQ29tcG9uZW50U3RvcmU+IHN0b3JlVjFfMSA9CisgICAgICBuZXcgVjFfMTo6dXRpbHM6OkNvbXBvbmVudFN0b3JlKHN0b3JlKTsKKyAgaWYgKHN0b3JlVjFfMS0+cmVnaXN0ZXJBc1NlcnZpY2Uoc3RyaW5nKGtTZXJ2aWNlTmFtZSkpICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgcmV0dXJuOworICB9CisgIHN0cmluZyBjb25zdCBwcmVmZXJyZWRTdG9yZU5hbWUgPSBzdHJpbmcoa1NlcnZpY2VOYW1lKTsKKyAgc3A8SUNvbXBvbmVudFN0b3JlPiBwcmVmZXJyZWRTdG9yZSA9CisgICAgICBJQ29tcG9uZW50U3RvcmU6OmdldFNlcnZpY2UocHJlZmVycmVkU3RvcmVOYW1lLmNfc3RyKCkpOworICBtSDJDMiA9IG5ldyBIMkMyQ29tcG9uZW50U3RvcmUocHJlZmVycmVkU3RvcmUpOworfQorCit2b2lkIENvZGVjU2VydmljZVJlZ2lzdHJhbnRGdXp6ZXI6Omludm9rZUNvbmZpZ1NNKCkgeworICB2ZWN0b3I8QzJQYXJhbSAqPiBjb25maWdQYXJhbXM7CisgIHVpbnQzMl90IHdpZHRoID0gbUZEUC0+Q29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICB1aW50MzJfdCBoZWlnaHQgPSBtRkRQLT5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IG1GRFAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKTsKKyAgdWludDMyX3QgY2hhbm5lbHMgPSBtRkRQLT5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgIGlmIChtRkRQLT5Db25zdW1lQm9vbCgpKSB7CisgICAgbUlucHV0U2l6ZSA9IG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQoMHUsIHdpZHRoLCBoZWlnaHQpOworICAgIGNvbmZpZ1BhcmFtcy5wdXNoX2JhY2sobUlucHV0U2l6ZSk7CisgIH0gZWxzZSB7CisgICAgaWYgKG1GRFAtPkNvbnN1bWVCb29sKCkpIHsKKyAgICAgIG1TYW1wbGVSYXRlSW5mbyA9IG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIHNhbXBsaW5nUmF0ZSk7CisgICAgICBjb25maWdQYXJhbXMucHVzaF9iYWNrKG1TYW1wbGVSYXRlSW5mbyk7CisgICAgfQorICAgIGlmIChtRkRQLT5Db25zdW1lQm9vbCgpKSB7CisgICAgICBtQ2hhbm5lbENvdW50SW5mbyA9IG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgY2hhbm5lbHMpOworICAgICAgY29uZmlnUGFyYW1zLnB1c2hfYmFjayhtQ2hhbm5lbENvdW50SW5mbyk7CisgICAgfQorICB9CisgIHZlY3Rvcjx1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICBtSDJDMi0+Y29uZmlnX3NtKGNvbmZpZ1BhcmFtcywgJmZhaWx1cmVzKTsKK30KKwordm9pZCBDb2RlY1NlcnZpY2VSZWdpc3RyYW50RnV6emVyOjppbnZva2VRdWVyeVNNKCkgeworICB2ZWN0b3I8QzJQYXJhbSAqPiBzdGFja1BhcmFtczsKKyAgdmVjdG9yPEMyUGFyYW06OkluZGV4PiBoZWFwUGFyYW1JbmRpY2VzOworICBpZiAobUZEUC0+Q29uc3VtZUJvb2woKSkgeworICAgIHN0YWNrUGFyYW1zID0ge307CisgICAgaGVhcFBhcmFtSW5kaWNlcyA9IHt9OworICB9IGVsc2UgeworICAgIHVpbnQzMl90IHN0cmVhbSA9IG1GRFAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKTsKKyAgICBtRnJhbWVSYXRlLnNldFN0cmVhbShzdHJlYW0pOworICAgIHN0YWNrUGFyYW1zLnB1c2hfYmFjaygmbUZyYW1lUmF0ZSk7CisgICAgaGVhcFBhcmFtSW5kaWNlcy5wdXNoX2JhY2sobUluZGV4KTsKKyAgfQorICB2ZWN0b3I8dW5pcXVlX3B0cjxDMlBhcmFtPj4gaGVhcFBhcmFtczsKKyAgbUgyQzItPnF1ZXJ5X3NtKHN0YWNrUGFyYW1zLCBoZWFwUGFyYW1JbmRpY2VzLCAmaGVhcFBhcmFtcyk7Cit9CisKK3ZvaWQgQ29kZWNTZXJ2aWNlUmVnaXN0cmFudEZ1enplcjo6aW52b2tlSDJDMkNvbXBvbmVudFN0b3JlKCkgeworICBpbml0SDJDMkNvbXBvbmVudFN0b3JlKCk7CisgIHNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudDsKKyAgc2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZXJmYWNlOworICBzdHJpbmcgYzJTdHJpbmcgPSBtRkRQLT5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCk7CisgIG1IMkMyLT5jcmVhdGVDb21wb25lbnQoYzJTdHJpbmcsICZjb21wb25lbnQpOworICBtSDJDMi0+Y3JlYXRlSW50ZXJmYWNlKGMyU3RyaW5nLCAmaW50ZXJmYWNlKTsKKyAgaW52b2tlQ29uZmlnU00oKTsKKyAgaW52b2tlUXVlcnlTTSgpOworCisgIHZlY3RvcjxzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gcGFyYW1zOworICBtSDJDMi0+cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoJnBhcmFtcyk7CisKKyAgQzJTdG9yZUlvblVzYWdlSW5mbyB1c2FnZUluZm87CisgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gcXVlcnkgPSB7CisgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlBvc3NpYmxlKAorICAgICAgICAgIEMyUGFyYW1GaWVsZDo6TWFrZSh1c2FnZUluZm8sIHVzYWdlSW5mby51c2FnZSkpLAorICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQb3NzaWJsZSgKKyAgICAgICAgICBDMlBhcmFtRmllbGQ6Ok1ha2UodXNhZ2VJbmZvLCB1c2FnZUluZm8uY2FwYWNpdHkpKSwKKyAgfTsKKyAgbUgyQzItPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKHF1ZXJ5KTsKKworICBtSDJDMi0+Z2V0TmFtZSgpOworICBzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IHBhcmFtUmVmbGVjdG9yID0gbUgyQzItPmdldFBhcmFtUmVmbGVjdG9yKCk7CisgIGlmIChwYXJhbVJlZmxlY3RvcikgeworICAgIHBhcmFtUmVmbGVjdG9yLT5kZXNjcmliZShDMkNvbXBvbmVudERvbWFpblNldHRpbmc6OkNPUkVfSU5ERVgpOworICB9CisgIG1IMkMyLT5saXN0Q29tcG9uZW50cygpOworICBzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gc3JjOworICBzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gZHN0OworICBtSDJDMi0+Y29weUJ1ZmZlcihzcmMsIGRzdCk7Cit9CisKK3ZvaWQgQ29kZWNTZXJ2aWNlUmVnaXN0cmFudEZ1enplcjo6cHJvY2Vzcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBtRkRQID0gbmV3IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKyAgaW52b2tlSDJDMkNvbXBvbmVudFN0b3JlKCk7CisgIC8qKiBSZWdpc3RlckNvZGVjU2VydmljZXMgaXMgY2FsbGVkIGhlcmUgdG8gaW1wcm92ZSBjb2RlIGNvdmVyYWdlICovCisgIC8qKiBhcyBjdXJyZW50bHkgaXQgaXMgbm90IGNhbGxlZCBieSBjb2RlY1NlcnZpY2VSZWdpc3RyYW50ICAgICAgICovCisgIFJlZ2lzdGVyQ29kZWNTZXJ2aWNlcygpOworICBkZWxldGUgbUZEUDsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBDb2RlY1NlcnZpY2VSZWdpc3RyYW50RnV6emVyIGNvZGVjU2VydmljZVJlZ2lzdHJhbnRGdXp6ZXI7CisgIGNvZGVjU2VydmljZVJlZ2lzdHJhbnRGdXp6ZXIucHJvY2VzcyhkYXRhLCBzaXplKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm0ucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtYXJtLnBvbGljeQppbmRleCA5MDU4ZjEwLi40MWVmY2UwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm0ucG9saWN5CisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybS5wb2xpY3kKQEAgLTg0LDUgKzg0LDYgQEAKIGdldGdpZDMyOiAxCiBnZXRlZ2lkMzI6IDEKIGdldGdyb3VwczMyOiAxCitzeXNpbmZvOiAxCiAKIEBpbmNsdWRlIC9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMvZXRjL3NlY2NvbXBfcG9saWN5L2NvZGVfY292ZXJhZ2UuYXJtLnBvbGljeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtYXJtNjQucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtYXJtNjQucG9saWN5CmluZGV4IDRjNTFhOWMuLmUxNTFhMDYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybTY0LnBvbGljeQorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm02NC5wb2xpY3kKQEAgLTc4LDUgKzc4LDYgQEAKIGdldGdpZDogMQogZ2V0ZWdpZDogMQogZ2V0Z3JvdXBzOiAxCitzeXNpbmZvOiAxCiAKIEBpbmNsdWRlIC9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMvZXRjL3NlY2NvbXBfcG9saWN5L2NvZGVfY292ZXJhZ2UuYXJtNjQucG9saWN5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9PV05FUlMgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9PV05FUlMKaW5kZXggYzcxNmNjZS4uMmE3NzljMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvT1dORVJTCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL09XTkVSUwpAQCAtMSwyICsxLDMgQEAKIGplZmZ2QGdvb2dsZS5jb20KLW1hcmNvbmVAZ29vZ2xlLmNvbQorZXNzaWNrQGdvb2dsZS5jb20KK2FxdWlsZXNjYW50YUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tZWRpYWV4dHJhY3Rvci5yYyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21lZGlhZXh0cmFjdG9yLnJjCmluZGV4IDVmYzI5NDEuLjRmYjUwZDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21lZGlhZXh0cmFjdG9yLnJjCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21lZGlhZXh0cmFjdG9yLnJjCkBAIC0zLDQgKzMsNCBAQAogICAgIHVzZXIgbWVkaWFleAogICAgIGdyb3VwIGRybXJwYyBtZWRpYWRybQogICAgIGlvcHJpbyBydCA0Ci0gICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcworICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAKaW5kZXggY2ZjNGM0MC4uODA4OGVmMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwCkBAIC0yNiw2ICsyNiw3IEBACiAgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYm5ibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgInBhY2thZ2VtYW5hZ2VyX2FpZGwtY3BwIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BbmRyb2lkLmJwCmluZGV4IDU5ODkxODEuLjE1NGI0ZmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BbmRyb2lkLmJwCkBAIC0xMTQsNiArMTE0LDcgQEAKICAgICAgICAgImxpYm1lZGlhdXRpbHMiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibWVkaWFtZXRyaWNzc2VydmljZS1haWRsLWNwcCIsCisgICAgICAgICJwYWNrYWdlbWFuYWdlcl9haWRsLWNwcCIsCiAgICAgXSwKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliYXVkaW91dGlsc19oZWFkZXJzIiwKQEAgLTE3MSw2ICsxNzIsNyBAQAogICAgICAgICAibGlic3RhdHNwdWxsIiwKICAgICAgICAgImxpYnN0YXRzc29ja2V0IiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgInBhY2thZ2VtYW5hZ2VyX2FpZGwtY3BwIiwKICAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL1RyYW5zYWN0aW9uTG9nLmggYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvVHJhbnNhY3Rpb25Mb2cuaAppbmRleCAwY2E0NjM5Li5mZDQyNTE4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvVHJhbnNhY3Rpb25Mb2cuaAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvVHJhbnNhY3Rpb25Mb2cuaApAQCAtMTU4LDcgKzE1OCw3IEBACiAgICAgICAgICAgICAgICAgKytpdCkgewogICAgICAgICAgICAgaWYgKGxsIDw9IDApIGJyZWFrOwogICAgICAgICAgICAgaWYgKHByZWZpeCAhPSBudWxscHRyICYmICFzdGFydHNXaXRoKGl0LT5maXJzdCwgcHJlZml4KSkgYnJlYWs7Ci0gICAgICAgICAgICBhdXRvIFtzLCBsXSA9IGR1bXBNYXBUaW1lSXRlbShpdC0+c2Vjb25kLCBsbCAtIDEsIHNpbmNlTnMsIHByZWZpeCk7CisgICAgICAgICAgICBzdGQ6OnRpZShzLCBsKSA9IGR1bXBNYXBUaW1lSXRlbShpdC0+c2Vjb25kLCBsbCAtIDEsIHNpbmNlTnMsIHByZWZpeCk7CiAgICAgICAgICAgICBpZiAobCA9PSAwKSBjb250aW51ZTsgLy8gZG9uJ3Qgc2hvdyBlbXB0eSBncm91cHMgKGR1ZSB0byBzaW5jZU5zKS4KICAgICAgICAgICAgIHNzIDw8ICIgIiA8PCBpdC0+Zmlyc3QgPDwgIlxuIiA8PCBzOwogICAgICAgICAgICAgbGwgLT0gbCArIDE7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvZnV6emVyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvZnV6emVyL0FuZHJvaWQuYnAKaW5kZXggYjAzZTUxOC4uOWRhNzI4MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL2Z1enplci9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9mdXp6ZXIvQW5kcm9pZC5icApAQCAtNTYsNiArNTYsNyBAQAogICAgICAgICAibGlic3RhdHNzb2NrZXQiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibWVkaWFtZXRyaWNzc2VydmljZS1haWRsLWNwcCIsCisgICAgICAgICJwYWNrYWdlbWFuYWdlcl9haWRsLWNwcCIsCiAgICAgXSwKIAogICAgIGluY2x1ZGVfZGlyczogWwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL2Z1enplci9tZWRpYW1ldHJpY3Nfc2VydmljZV9mdXp6ZXIuY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2Z1enplci9tZWRpYW1ldHJpY3Nfc2VydmljZV9mdXp6ZXIuY3BwCmluZGV4IDhiMGI0NzkuLjA2YWIxNmUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9mdXp6ZXIvbWVkaWFtZXRyaWNzX3NlcnZpY2VfZnV6emVyLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvZnV6emVyL21lZGlhbWV0cmljc19zZXJ2aWNlX2Z1enplci5jcHAKQEAgLTQ4LDYgKzQ4LDcgQEAKICAgICB2b2lkIGludm9rZUF1ZGlvQW5hbHl0aWNzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKICAgICB2b2lkIGludm9rZVRpbWVkQWN0aW9uKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKICAgICB2b2lkIHByb2Nlc3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHN0ZDo6YXRvbWljX2ludCBtVmFsdWUgPSAwOwogfTsKIAogdm9pZCBNZWRpYU1ldHJpY3NTZXJ2aWNlRnV6emVyOjppbnZva2VTdGFydHNXaXRoKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CkBAIC0zNDIsMTEgKzM0MywxMCBAQAogdm9pZCBNZWRpYU1ldHJpY3NTZXJ2aWNlRnV6emVyOjppbnZva2VUaW1lZEFjdGlvbihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIEZ1enplZERhdGFQcm92aWRlciBmZHAgPSBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CiAgICAgYW5kcm9pZDo6bWVkaWFtZXRyaWNzOjpUaW1lZEFjdGlvbiB0aW1lZEFjdGlvbjsKLSAgICBzdGQ6OmF0b21pY19pbnQgdmFsdWUgPSAwOwogCiAgICAgd2hpbGUgKGZkcC5yZW1haW5pbmdfYnl0ZXMoKSkgewogICAgICAgICB0aW1lZEFjdGlvbi5wb3N0SW4oc3RkOjpjaHJvbm86OnNlY29uZHMoZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmdmFsdWVdIHsgKyt2YWx1ZTsgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhpc10geyArK21WYWx1ZTsgfSk7CiAgICAgICAgIHRpbWVkQWN0aW9uLnNpemUoKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvdGVzdHMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDNiYWY3MzkuLmY0NmZiYWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy90ZXN0cy9BbmRyb2lkLmJwCkBAIC0zMyw2ICszMyw3IEBACiAgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgIm1lZGlhbWV0cmljc3NlcnZpY2UtYWlkbC1jcHAiLAorICAgICAgICAicGFja2FnZW1hbmFnZXJfYWlkbC1jcHAiLAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0FuZHJvaWQuYnAKaW5kZXggZjMxMjAyYi4uNWQ4MDc0NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9BbmRyb2lkLmJwCkBAIC05MCw3ICs5MCw3IEBACiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJyZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlLVYxLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJyZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlLVYxLW5kayIsCiAgICAgXSwKIAogICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiXSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvQW5kcm9pZC5icAppbmRleCBlYzRiYTU4Li42MTg2MjZmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9BbmRyb2lkLmJwCkBAIC01Niw3ICs1Niw3IEBACiAgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYnJlc291cmNlbWFuYWdlcnNlcnZpY2UiLAotICAgICAgICAicmVzb3VyY2VvYnNlcnZlcl9haWRsX2ludGVyZmFjZS1WMS1uZGtfcGxhdGZvcm0iLAorICAgICAgICAicmVzb3VyY2VvYnNlcnZlcl9haWRsX2ludGVyZmFjZS1WMS1uZGsiLAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJpbmRlciIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL0FuZHJvaWQuYnAKaW5kZXggYTlmZDE0Zi4uZmE1ZWI0ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvQW5kcm9pZC5icApAQCAtNDcsNyArNDcsNyBAQAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibWVkaWF0cmFuc2NvZGluZ19haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAorICAgICAgICAibWVkaWF0cmFuc2NvZGluZ19haWRsX2ludGVyZmFjZS1uZGsiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKQEAgLTgwLDcgKzgwLDcgQEAKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgIm1lZGlhdHJhbnNjb2RpbmdfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKKyAgICAgICAgIm1lZGlhdHJhbnNjb2RpbmdfYWlkbF9pbnRlcmZhY2UtbmRrIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL09XTkVSUyBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvT1dORVJTCmluZGV4IDgyNWM1ODYuLjkzMzRiZmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvT1dORVJTCisrKyBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvT1dORVJTCkBAIC0xLDQgKzEsNCBAQAotYWtlcnN0ZW5AZ29vZ2xlLmNvbQotaGt1YW5nQGdvb2dsZS5jb20KLWxuaWxzc29uQGdvb2dsZS5jb20KKyMgQnVnIGNvbXBvbmVudDogNzYxNDMwCiAKKyMgZ28vYW5kcm9pZC1md2stbWVkaWEtc29sdXRpb25zIGZvciBpbmZvIG9uIGFyZWFzIG9mIG93bmVyc2hpcC4KK2luY2x1ZGUgcGxhdGZvcm0vZnJhbWV3b3Jrcy9hdjovbWVkaWEvamFuaXRvcnMvbWVkaWFfc29sdXRpb25zX09XTkVSUwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvQW5kcm9pZC5icAppbmRleCBjYjE4MGVjLi5hZTEzNjU2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9BbmRyb2lkLmJwCkBAIC0zNCw4ICszNCw4IEBACiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJtZWRpYXRyYW5zY29kaW5nX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCi0gICAgICAgICJyZXNvdXJjZW1hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKKyAgICAgICAgIm1lZGlhdHJhbnNjb2RpbmdfYWlkbF9pbnRlcmZhY2UtbmRrIiwKKyAgICAgICAgInJlc291cmNlbWFuYWdlcl9haWRsX2ludGVyZmFjZS1uZGsiLAogICAgICAgICAibGlibWVkaWF0cmFuc2NvZGluZ3NlcnZpY2UiLAogICAgIF0sCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0SGVscGVyLmggYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL01lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlVGVzdEhlbHBlci5oCmluZGV4IDBjYjJmYWQuLjhlMTdmNTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0SGVscGVyLmgKKysrIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9NZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3RIZWxwZXIuaApAQCAtMjU5LDkgKzI1OSw3IEBACiBzdGF0aWMgY29uc3RleHByIGJvb2wgc3VjY2VzcyA9IHRydWU7CiBzdGF0aWMgY29uc3RleHByIGJvb2wgZmFpbCA9IGZhbHNlOwogCi1zdHJ1Y3QgVGVzdENsaWVudENhbGxiYWNrIDogcHVibGljIEJuVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgRXZlbnRUcmFja2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFRlc3RDbGllbnRDYWxsYmFjaz4geworc3RydWN0IFRlc3RDbGllbnRDYWxsYmFjayA6IHB1YmxpYyBCblRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2ssIHB1YmxpYyBFdmVudFRyYWNrZXIgewogICAgIFRlc3RDbGllbnRDYWxsYmFjayhjb25zdCBjaGFyKiBwYWNrYWdlTmFtZSwgaW50MzJfdCBpZCkKICAgICAgICAgICA6IG1DbGllbnRJZChpZCksIG1DbGllbnRQaWQoUElEKGlkKSksIG1DbGllbnRVaWQoVUlEKGlkKSksIG1QYWNrYWdlTmFtZShwYWNrYWdlTmFtZSkgewogICAgICAgICBBTE9HSSgiVGVzdENsaWVudENhbGxiYWNrICVkIGNyZWF0ZWQ6IHBpZCAlZCwgdWlkICVkIiwgaWQsIFBJRChpZCksIFVJRChpZCkpOwpAQCAtMzQ4LDggKzM0Niw4IEBACiAgICAgICAgIEFMT0dEKCJyZWdpc3RlcmluZyAlcyB3aXRoIHVpZCAlZCIsIHBhY2thZ2VOYW1lLCBtQ2xpZW50VWlkKTsKIAogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50PiBjbGllbnQ7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXMgPQotICAgICAgICAgICAgICAgIHNlcnZpY2UtPnJlZ2lzdGVyQ2xpZW50KHNoYXJlZF9mcm9tX3RoaXMoKSwga0NsaWVudE5hbWUsIHBhY2thZ2VOYW1lLCAmY2xpZW50KTsKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IHNlcnZpY2UtPnJlZ2lzdGVyQ2xpZW50KHJlZjxUZXN0Q2xpZW50Q2FsbGJhY2s+KCksIGtDbGllbnROYW1lLCBwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGllbnQpOwogCiAgICAgICAgIG1DbGllbnQgPSBzdGF0dXMuaXNPaygpID8gY2xpZW50IDogbnVsbHB0cjsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21pbmlqYWlsL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9taW5pamFpbC9BbmRyb2lkLmJwCmluZGV4IDNhODllMTIuLjAzODE5N2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21pbmlqYWlsL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWluaWphaWwvQW5kcm9pZC5icApAQCAtMzEsMTcgKzMxLDYgQEAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKIH0KIAotLy8gQnkgYWRkaW5nICJ2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlIiB0byAibGliYXZzZXJ2aWNlc19taW5pamFpbCIsIHdlIGRvbid0Ci0vLyBuZWVkIHRvIGhhdmUgImxpYmF2c2VydmljZXNfbWluaWphaWxfdmVuZG9yIiBhbnkgbG9uZ2VyLgotLy8gImxpYmF2c2VydmljZXNfbWluaWphaWxfdmVuZG9yIiB3aWxsIGJlIHJlbW92ZWQsIG9uY2Ugd2UgcmVwbGFjZSBpdCB3aXRoCi0vLyAibGliYXZzZXJ2aWNlc19taW5pamFpbCIgaW4gYWxsIHZlbmRvciBtb2R1bGVzLiAoYi8xNDYzMTM3MTApCi1jY19saWJyYXJ5X3NoYXJlZCB7Ci0gICAgbmFtZTogImxpYmF2c2VydmljZXNfbWluaWphaWxfdmVuZG9yIiwKLSAgICB2ZW5kb3I6IHRydWUsCi0gICAgZGVmYXVsdHM6IFsibGliYXZzZXJ2aWNlc19taW5pamFpbF9kZWZhdWx0cyJdLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAotfQotCiAvLyBVbml0IHRlc3RzLgogY2NfdGVzdCB7CiAgICAgbmFtZTogImxpYmF2c2VydmljZXNfbWluaWphaWxfdW5pdHRlc3QiLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWluaWphaWwvT1dORVJTIGIvc2VydmljZXMvbWluaWphaWwvT1dORVJTCmluZGV4IDE5ZjRmOWYuLjllYmY0MWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21pbmlqYWlsL09XTkVSUworKysgYi9zZXJ2aWNlcy9taW5pamFpbC9PV05FUlMKQEAgLTEsMiArMSwyIEBACiBqb3JnZWxvQGdvb2dsZS5jb20KLW1hcmNvbmVAZ29vZ2xlLmNvbQorZXNzaWNrQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLmJwCmluZGV4IDRjNTgwNDAuLjM1NjNkNjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQW5kcm9pZC5icApAQCAtNjgsNiArNjgsNyBAQAogICAgICAgICAiYWF1ZGlvLWFpZGwtY3BwIiwKICAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKICAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbiIsCisgICAgICAgICJwYWNrYWdlbWFuYWdlcl9haWRsLWNwcCIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy90dW5lci9BbmRyb2lkLmJwCmluZGV4IGNkMTFjODguLjFkY2ZlNTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvdHVuZXIvQW5kcm9pZC5icApAQCAtODksMTMgKzg5LDE0IEBACiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibWVkaWEiLAogICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAidHZfdHVuZXJfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKLSAgICAgICAgInR2X3R1bmVyX3Jlc291cmNlX21hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKKyAgICAgICAgInBhY2thZ2VtYW5hZ2VyX2FpZGwtY3BwIiwKKyAgICAgICAgInR2X3R1bmVyX2FpZGxfaW50ZXJmYWNlLW5kayIsCisgICAgICAgICJ0dl90dW5lcl9yZXNvdXJjZV9tYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLW5kayIsCiAgICAgICAgICJ0dl90dW5lcl9yZXNvdXJjZV9tYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLWNwcCIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi5mbXEtVjEtbmRrX3BsYXRmb3JtIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY29tbW9uLmZtcS1WMS1uZGsiLAogICAgICAgICAibGliYWlkbGNvbW1vbnN1cHBvcnQiLAogICAgIF0sCiAKQEAgLTEyOCwxMiArMTI5LDEyIEBACiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlidHVuZXJzZXJ2aWNlIiwKICAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgInR2X3R1bmVyX3Jlc291cmNlX21hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKKyAgICAgICAgInR2X3R1bmVyX3Jlc291cmNlX21hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrIiwKICAgICAgICAgInR2X3R1bmVyX3Jlc291cmNlX21hbmFnZXJfYWlkbF9pbnRlcmZhY2UtY3BwIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgInR2X3R1bmVyX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJ0dl90dW5lcl9haWRsX2ludGVyZmFjZS1uZGsiLAogICAgIF0sCiAKICAgICBpbml0X3JjOiBbIm1lZGlhdHVuZXIucmMiXSwK